ギャップロック
InnoDBにおけるギャップロックは、存在しないレコード間の「隙間」をロックするための仕組み
インデックス上の既存レコード間の空間に対して設定されるロック
https://scrapbox.io/files/68387927c10b966f19bfbfd5.png
(-∞, 10),(10, 20),(20, 30),(30, +∞)の範囲のギャップがロック対象
主な目的
ファントムリードの防止が最大の目的
同じトランザクション内で、複数回SELECT文を実行した際に、結果が変わらないように他のトランザクションによるレコードを追加をさせないため
インデックス種類別のギャップロック発生可能性
table:gap-lock
インデックス種類 ギャップロック発生 理由
セカンダリインデックス 高い レコードロック+ギャップロック+ネクストキーロック
PRIMARY KEY 低い レコードロックの発生がほとんど
ユニークインデックス やや低い 該当レコードがあればレコードロック、なければギャップロック
インデックスなし 激高い テーブルフルスキャンにより、全レコードがロック
Docs
https://dev.mysql.com/doc/refman/8.0/ja/innodb-locking.html#innodb-gap-locks
#MySQL #InnoDB