MySQLのロックに関する調査メモ その1 - @ledsun blog の続きです。
MySQLのロックについて - SH2の日記 のPDFを読みました。 面白かったです。
MySQL(というかInnoDB)の最初のスタート地点が「絶対にファントムリードさせたくない」なようです。 つまり一度トランザクションをはじめたら、他のトランザクションでの操作を見たくありません。 例えば、自トランザクションで見ている行と行の間に、他トランザクションからInsertされたくありません。 ということは行単位のロックでは足りなくて、自トランザクションで見ている範囲をロックしたいです。 これが、ギャップロックとネクストキーロックのようです。
今の段階ではギャップロックとネクストキーロックの違いはわかっていません。 特に、なぜネクストキーロックをしなければいけないのかよくわかりません。
どうもこの辺の思想は「トランザクション処理 概念と技法」のでしょうか?
もう一つ、MySQLの面白い特徴は、プライマリーインデックスのリーフに行があることです。
MySQL :: MySQL 8.0 リファレンスマニュアル :: 15.6.2.1 クラスタインデックスとセカンダリインデックス
すべての InnoDB テーブルは、行のデータが格納されているクラスタ化されたインデックスと呼ばれる特別なインデックスを持っています。
MySQL :: MySQL 8.0 リファレンスマニュアル :: 15.7.1 InnoDB ロック に次のように書いてあります。
レコードロックは、インデックスレコードのロックです。
どうもこういうことを説明しているみたいです。
また、セカンダリーインデックスをロックするときは、セカンダリーインデックスとプライマリーインデックスのインデックスレコードを両方ロックするそうです。