22. DBのロックについて(3)
行ロックの挙動 ※ 例は全てMySQL5.1系で検証
例1: 存在するレコードを行ロックした場合
SELECT * FROM t WHERE c = 2 FOR UPDATE
Gap(Infimum)
DELETE FROM t WHERE c = 2
1
Gap
×
2 L
Gap
5
× INSERT INTO t (c) VALUE(2)
Gap(supremum)
参考: ・インフィニットループ社内勉強会資料 佐々木 亨基 MySQL InnoDB によるロック処理入門 ※近日公開予定
・技術評論社 奥野幹也 著 エキスパートのためのMySQL運用+管理トラブルシューティングガイド
23. DBのロックについて(4)
ギャップロックの挙動
例2: 存在しないレコードを行ロックした場合
SELECT * FROM t WHERE c = 4 FOR UPDATE
Gap(Infimum)
SELECT * FROM t WHERE c = 3
1
FOR UPDATE
Gap
○
2
× INSERT INTO t (c) VALUE(3)
×
Gap L
5 INSERT INTO t (c) VALUE(4)
Gap(supremum)
レコードが存在しないため、ギャップがロックされる
レコードが存在しないため、ギャップがロックされる
しないため