MySQLのギャップロックとネクストキーロック
MySQLでおきるギャップロックの解説
参考
この記事がかなり分かりやすかった
https://zenn.dev/socialplus/articles/2e16da32f39a0c
MySQLのギャップロックとネクストキーロック - 41から始めました
ギャップロック、ネクストキーロックを起こして挙動を確認してみた|SHIFT Group 技術ブログ|note
table:gaplock
id データ有無 ロック
1 あり 排他ロック
2 あり 排他ロック
3 あり 排他ロック
4 あり 排他ロック
5 無し!!! 排他ロック
6 あり 排他ロック
code:gaplock.sql
mysql> begin ;
Query OK, 0 rows affected (0.00 sec)
mysql> insert into test.j_pedigree values(5,'ダリオ','ブランドー',null,null,0,0);
ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
ギャップロック
データがない部分に対しても排他ロックがかかり、そこにデータを入れようとしてもロック待ちとなる
* index値を持つ行と行の間にあるギャップ
* 先頭のindex値を持つ行の前のギャップ
* 末尾のindex値を持つ行の後のギャップ
通常データを書き込む時はそのロックの単位は行(row)で行われます
それはMySQLでも変わらないのですが、MySQLではその行以外もロック対象になることがあります
その一つがギャップロックです
要はindexのために複数をPrimary Keyとするような複合主キーでは問題が発生しやすい