使用相同的数据更新行时,可以在我们的(testing)Galera群集上触发死锁。
INSERT INTO test (id, val) VALUES (1, 42), (2, 47); -- Query OK, 2 rows affected (0.01 sec) -- Records: 2 Duplicates: 0 Warnings: 0
将值更新为不同的值不会导致错误:
UPDATE test SET val=43 WHERE id=1; -- Query OK, 1 row affected (0.00 sec) -- Rows matched: 1 Changed: 1 Warnings: 0
而当你把它设置为相同的值:
UPDATE test SET val=47 WHERE id=2; -- ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
它似乎是一种警告,不正确地中继(从/var/log/mysql ):
140106 13:52:04 [Warning] WSREP: SQL statement was ineffective, THD: 12, buf: 103 QUERY: UPDATE test SET val=47 WHERE id=2 => Skipping replication 140106 13:52:04 [Warning] WSREP: SQL statement was ineffective, THD: 12, buf: 103 QUERY: UPDATE test SET val=47 WHERE id=2 => Skipping replication
注意:表格被创build为
CREATE TABLE IF NOT EXISTS `test` ( `id` int(3) NOT NULL PRIMARY KEY, `val` int(3) NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf-8;
如果服务器上的二进制日志格式是“STATEMENT”(通过SELECT @@ binlog_format;检查)您应该使用–binlog-format = row重新启动服务器,然后重试您的查询。 通常这会解决你的问题!
资料来源: https : //mariadb.atlassian.net/browse/MDEV-5490?jql=project%20%3D%20MDEV%20AND%20issuetype%20%3D%20Bug%20AND%20text%20~%20%22update%20deadlock %22