【ぎゃっぷろっく】

ギャップロック とは?

公開:
💡 まだ行がない隙間への挿入を待たせる

MySQL InnoDBで、インデックスレコードの間などの隙間への挿入を防ぐロック。既存の行そのものを守るレコードロックとは役割が異なる。

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

参考資料

← 用語集にもどる