【问题标题】:Deadlock found when trying to get lock; try restarting transaction尝试获取锁时发现死锁;尝试重启事务
【发布时间】:2013-09-30 08:01:01
【问题描述】:

我正在从我的网站向我的用户发送批量邀请。为此,我将包含电子邮件的逗号分隔字符串传递给我在 mysql 中的存储过程。在这个存储过程中,一个while循环解析每封电子邮件(使用以逗号分隔的substring())并检查现有数据库,然后如果它不存在则插入到表中,或者如果该电子邮件已经存在,则生成带有guid的电子邮件链接。该过程对于小批量(例如,低于 200-250 封电子邮件)运行良好,但如果批量较大(250 多封电子邮件),则整个过程卡住并且下一个请求会出现死锁错误(原始错误是:“尝试获得锁定;尝试重新启动事务”)。所以,我计划在我的 javascript 或 c# 文件(编程语言文件)上做一个 while 循环,并将每封电子邮件发送到存储过程。 在上述情况下,mysql连接数会增加,可能会出现最大连接错误。

那么,我想问一下,用mysql做这种工作的最好方法是什么?

【问题讨论】:

    标签: mysql database stored-procedures amazon-rds database-deadlocks


    【解决方案1】:

    我认为一次给一个程序发送电子邮件是一个正确的解决方案,但您不需要为每个项目建立新的连接甚至新的请求。大多数语言都支持准备好的语句执行 (and here's the answer on how to use them in C#)。

    反过来,死锁可能是由您自己的代码引起的,但如果没有它的片段,就很难判断。也许您的过程不是可重入的,或者可以从其他位置访问数据。

    【讨论】:

    • 感谢@kworr,但它的执行速度非常慢,并且会抛出死锁错误。
    • 实际上准备好的语句比常规语句要快得多,因为您不需要每次都解析 SQL。它可以比在 mysql 中拆分整个字符串更快。
    • 我已经发布了另一个帖子 (stackoverflow.com/questions/19091968/…) 供您参考。请指导我。谢谢
    猜你喜欢
    • 2013-09-20
    • 2013-07-18
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 2011-01-20
    • 2016-05-13
    • 2011-02-05
    相关资源
    最近更新 更多