避免在尝试获取锁时发现死锁;尝试在重复密钥更新时在MariaDB(MySQL)INSERT上重新启动事务

避免在尝试获取锁时发现死锁;尝试在重复密钥更新时在MariaDB(MySQL)INSERT上重新启动事务,mysql,mariadb,database-deadlocks,Mysql,Mariadb,Database Deadlocks,我有一张简单的桌子,上面有很多行。没有外键。在多个列上有一个唯一键 以下是insert语句的示例: 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') 我已经读过这篇文章,它是一篇关于

我有一张简单的桌子,上面有很多行。没有外键。在多个列上有一个唯一键

以下是insert语句的示例:

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')
我已经读过这篇文章,它是一篇关于同一个错误消息被不同用例触发的精彩讨论

自动提交是正确的。这是唯一的声明。没有开始或承诺


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

首先,我希望语法正确

INSERT INTO das_args (a,b,c,d)
    VALUES (1,2,3,4)
    ON DUPLICATE KEY UPDATE  d = VALUES(d);
至于死锁——听起来事务中不止一条语句。让我们通过
COMMIT
查看
BEGIN


自动提交的值是多少?

首先,我希望语法是

INSERT INTO das_args (a,b,c,d)
    VALUES (1,2,3,4)
    ON DUPLICATE KEY UPDATE  d = VALUES(d);
至于死锁——听起来事务中不止一条语句。让我们通过
COMMIT
查看
BEGIN


自动提交的值是多少?

自动提交为真。这是唯一的声明。没有begin或commit。使用
UNIQUE(a、b、c)
,我很惊讶您可能会出现死锁。请提供
显示引擎INNODB状态的“最新死锁”部分我也很惊讶!我将获得输出。自动提交为true。这是唯一的声明。没有begin或commit。使用
UNIQUE(a、b、c)
,我很惊讶您可能会出现死锁。请提供
显示引擎INNODB状态的“最新死锁”部分我也很惊讶!我会得到输出。