【问题标题】:Avoid Deadlock found when trying to get lock; try restarting transaction on MariaDB (MySQL) INSERT ON DUPLICATE KEY UPDATE避免尝试获取锁时发现死锁;尝试在 MariaDB (MySQL) 上重新启动事务 INSERT ON DUPLICATE KEY UPDATE
【发布时间】:2020-03-27 06:33:51
【问题描述】:

我有一个简单的表格,里面有一堆行。没有外键。多个列上都有一个唯一键。

下面是插入语句的示例:

INSERT INTO das_args (a,b,c,d) VALUES (1,2,3,4) ON DUPLICATE KEY UPDATE VALUES(1,2,3,4)

唯一键是 (a,b,c)。

错误是:

(1213, 'Deadlock found when trying to get lock; try restarting transaction')

我读过How to avoid mysql 'Deadlock found when trying to get lock; try restarting transaction',这是对不同用例触发相同错误消息的精彩讨论。

自动提交为真。这是唯一的说法。没有 BEGIN 或 COMMIT。

我看不出有什么方法可以重构它。只有两个客户端似乎同时更新相同的唯一密钥(这不应该发生,但确实发生了)。我的代码只是重新运行该语句并成功,但我想删除死锁错误。

【问题讨论】:

    标签: mysql mariadb database-deadlocks


    【解决方案1】:

    首先,我希望语法是

    INSERT INTO das_args (a,b,c,d)
        VALUES (1,2,3,4)
        ON DUPLICATE KEY UPDATE  d = VALUES(d);
    

    至于死锁——听起来事务中不止一个语句。让我们通过COMMIT 来看看BEGIN

    autocommit 的值是多少?

    【讨论】:

    • 自动提交为真。这是唯一的说法。没有开始或提交。
    • 有了UNIQUE(a,b,c),我很惊讶你会陷入僵局。请提供SHOW ENGINE INNODB STATUS;的“最新死锁”部分
    • 我也很惊讶!我会得到输出。
    猜你喜欢
    • 2011-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-18
    • 2020-10-08
    • 2018-07-27
    • 2013-09-20
    相关资源
    最近更新 更多