同じデータで行を更新するときに、(テスト)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
注:テーブルは次のように作成されます
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で再起動してから、クエリを再試行する必要があります。通常、これで問題は解決します。