deadlock
発生原因
SQLの発行タイミングによって、発生する
トランザクションの時間が長いと、ロック待ちによるdeadlockを引き起こしやすくなる
発生パターン1
2つのトランザクションで相互に同じレコードをロックする
発生パターン2
code:SQL
(A2): INSERT INTO order (code) VALUES ('12A34'); -- > id=10
(B3): UPDATE order SET amount=2000 WHERE id IN (
SELECT DISTINCT order_id FROM order_item WHERE id IN (4,5,8));
(A4): INSERT INTO order_item (order_id, item_name, price) VALUES (10, 'pie', 180);
table:gaplock-sequence
トランザクションA トランザクションB メモ
1 begin; begin; どちらが先でもOK
2 (A2) orderのネクストキーロックを取得
3 (B3) ロック待ちで固まる order_itemのギャップロックを取得後、orderのギャップロック待ち
4 (A4) deadlock発生! order_itemのネクストキーロック待ち
回避方法
上記(B3)を2つのSQLに分ける
code:SQL
(B3-1): SELECT DISTINCT order_id FROM order_item WHERE id IN (4,5,8); -- 結果の数値列をXとする
(B3-2): UPDATE order SET amount=2000 WHERE id IN (X);