分析と回答
RR (Repeatable Reading) レベルでの現在の読み取りによって引き起こされるファントム読み取りの問題を解決するために、ギャップ ロックはインデックス リーフ ノードの次のポインターをロックします。
スナップショットの読み取り
RR 分離レベルの下では、スナップショット読み取りではデータの履歴バージョンを読み取ることができ、またデータの現在のバージョンを読み取ることもできます。したがって、スナップショット読み取りにはロックが必要なく、ファントム読み取りは発生しません。
現在読んでいます
- 現在の読み取り値: 選択...共有モードでロック、選択...更新用
- 現在の読み取り値: 更新、削除、挿入
- 現在の読み取りはレコードの最新バージョンであり、同じデータを返すには、現在の読み取りによって読み取られたデータを追加、変更、または削除できないようにロック (行ロック、ギャップ ロック、テーブル ロック) する必要があります。
データベース X
主キー | b インデックス | cフィールド |
---|---|---|
1 | 2 | あ |
3 | 6 | B |
5 | 4 | C |
7 | 10 | D |
9 | 8 | E |
ギャップロック範囲
select c from X where a=4 for update;
主キーインデックスリーフノードの 3 の次のポインタをロックします。
select c from X where a=3 for update;
ギャップ ロックはリーフ ノード 3 のみをロックする行ロックに縮退しますが、なぜ不要なのでしょうか。
select c from X where a>4 for update;
リーフ ノード 3 と後続のすべてのノードは行ロックを追加し、次のポインターがロックされます。
select a from X where c=2 for update;
テーブル ロックが発生するのは、c には行ロックやギャップ ロックを保存するためのインデックス構造がないためです。
反映と拡張
- mysql では間隔更新を使用しないようにしてください。
- 更新が必要な場合は ID=X を使用してください
- クエリもIDで確認してみる
ニャー インタビュー アシスタント:面接の質問に対するワンストップ ソリューション。WeChat アプレット[ニャー インタビュー アシスタント]を検索するか、 [ニャー ブラシの質問] -> インタビュー アシスタントの 無料質問に 従うことができます。面接に関する優れた知識やスキルをお持ちの方は、ぜひ共有してください。