【ロック】ネクストキーロックとギャップロック - notee/MySQL GitHub Wiki

参考 : http://dev.mysql.com/doc/refman/5.1-olh/ja/innodb-record-level-locks.html

インデックス行ロック

インデックスレコードにかけるロック。存在する行にはこれがかかる。

ギャップロック

インデックスレコード間にあるギャップのロック、先頭のインデックスレコードの前や末尾のインデックスレコードのあとにあるギャップのロック、のいずれか。存在しない行にはこれがかかる(存在する行の間、にかけるロック)。一意に対象行が定まる処理の場合、このギャップロックは発生しない。したがってこのギャップロックが発生するのは

  • 範囲指定での処理

  • 存在しない行への処理

の場合のみとなる。

ネクストキーロック

インデックスレコードに対するレコードロックと、そのインデックスレコードの前にあるギャップに対するギャップロックとを組み合わせたもの。例えばidがPKのテーブルに

id = 10, 20, 30

のレコードがあったとすると、ネクストキーロックのとりうる範囲は

  • id <= 10

  • 10 < id <= 20

  • 20 < id <= 30

  • 30 < id

の4種類である。

ロックの取り方

処理において、対象行が見つかった場合

検索範囲を含むギャップロック、および見つかった対象行の最後のものより更に一つ先のレコードまでのネクストキーロックをとる。

対象行が見つからなかった場合

検索範囲を含むギャップロックをとる。