対象バージョン
MariaDB 10.3.36事前準備
1 2 3 4 5 6 7 |
CREATE TABLE hoge ( id INT NOT NULL, updated_at DATETIME NOT NULL, PRIMARY KEY (id) ); INSERT INTO hoge(id, updated_at) VALUES (1, now()); |
再現手順
- ノードA
GET_LOCKでロックを取得してからトランザクションを開始します。
123SELECT GET_LOCK('hogehoge', 10);begin;UPDATE hoge SET updated_at = now() WHERE id = 1; - ノードB
別のノードから同じレコードを更新してノードAの処理を失敗させます。
1UPDATE hoge SET updated_at = now() WHERE id = 1; - ノードA
Deadlockが発生したのでcommitは失敗になります。RELEASE_LOCKを実行するとクラッシュします。
RELEASE_LOCKを明示的に実行しなくても、接続が切れる時に暗黙で実行されてクラッシュします。
12commit;SELECT RELEASE_LOCK('hogehoge');