MySQLの行ロックとギャップロックの違いは?
MySQL の「Next-Key Lock」と「Gap Lock」は、データベースに対して複数のトランザクションが同時に操作を行った場合にデータの一貫性を確保するために用いられるロックメカニズムです。
インデックスレコードのロックを指し、インデックスレコード本体とその後の「ギャップ」(インデックスレコードとその次のインデックスレコードの間の空白)のロックがある。
ギャップロックとは、インデックスレコード自体をロックせず、インデックスレコード間の「ギャップ」をロックすることを意味しています。
以下のように区別できます:
- 異なるロック範囲。レコードロックはインデックスレコード自体と後続のギャップをロックしますが、ギャップロックはインデックスレコードのギャップ間をロックし、インデックスレコード自体には及びません。
- 粒度の違い:インデックスロックはレコードとレコードの間のギャップをロックする細粒度のロック機構である一方、ギャップロックはレコード間を一気にロックする粗粒度のロック機構である。
- ロックの効果は異なる。キーロックは競合下では、2 つ以上のトランザクションが同一のインデックスレコードへの同時挿入が発生しないことを保証できるが、ギャップロックは、2 つ以上のトランザクションが同一のインデックスレコード間のギャップへの同時挿入が発生しないことを保証できる。
- 異なる用途:行ロックは読み取りと挿入の用途に適合し、ダーティリードや不可逆リードの問題を有効に回避できます;ギャップロックは挿入と削除の用途に適合し、ファントムリードの問題を有効に回避できます。
インテンションロックとギャップロックは排他ロックである点に注意する必要があり、つまり、同じトランザクションがインテンションロックとギャップロックを同時に保持することはできず、そうすることでデッドロックの可能性は回避される。