【ぎゃっぷろっく】
ギャップロック とは?
公開:
💡 まだ行がない隙間への挿入を待たせる
MySQL InnoDBで、インデックスレコードの間などの隙間への挿入を防ぐロック。既存の行そのものを守るレコードロックとは役割が異なる。
📌 このページのポイント
まだ存在しない行もロックするの?
InnoDBでは、インデックスの隙間への挿入を防げるよ。範囲を調べている間に別の処理がその範囲へ行を追加すると、調べた結果が変わり得る。その挿入を待たせるのがギャップロックなんだ。
隙間って、どこからどこまでなの?
10や20の行の書き換えも止めるの?
同じ隙間を2人がロックしたら、片方が待つの?
ギャップロック同士は共存できるよ。どちらも挿入を抑えるためのロックだからだね。普通の行ロックと同じ競合規則だと思い込まないことが大切だよ。
すべての検索で使われるの?
違うよ。通常の一貫性読み取りとロックを取る読み取りは別だし、分離レベルも関係する。既存行を一意索引の全キーで特定する検索では隙間を守らずに済む場合がある。READ COMMITTEDでも外部キーや重複キーの検査にはギャップロックが使われることがあるんだ。
まとめ:ざっくりこれだけ覚えればOK!
「ギャップロック」は「まだ行がない隙間への挿入を待たせる」と押さえておこう!
📖 おまけ:英語の意味
「gap lock」 = 隙間のロック
💬 gap lockは「隙間のロック」という意味の表現だよ。