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