MariaDB Galera群集上的死锁触发器

使用相同的数据更新行时,可以在我们的(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