同じクエリーでさまざまな時間にさまざまな行のセットが生成されると,いわゆるファントム。,选择
が2回実行されたが,1回目には返されなかった行が2回目には返された場合,その行が「ファントム」啊哈,啊哈。
孩子
テーブルのid
カラム上にインデックスがあり,識別子の値が100よりも大きいすべての行をテーブルから読み取り,選択された行の一部のカラムをあとで更新するという意図でロックすると仮定します。
SELECT * FROM child WHERE id > 100 FOR UPDATE;
,id
★★★★★★★★★★★★★★★★★★★★★★★★★() () (id
90、102、。スキャン範囲内のインデックスレコード上に設定されたロックによって,ギャップ(この場合のギャップは90から102まで)への挿入がロックアウトされていない場合は,別のセッションがid
。【中文译文选择
を実行すると,クエリーから返された結果セット内に,id
【中文】「ファントム」)。一連の行をデータ項目とみなせば,この新しいファントムの子は,“トランザクション中は読み取られるデータが変更されないようにトランザクションを実行できるべきである”というトランザクションの分離原則に違反しています。
★★★★★★★★★InnoDB
では通常,インデックス行ロックとギャップロックを組み合わせたネクストキーロック。InnoDB
は,テーブルインデックスを検索またはスキャンするときに,生成されたインデックスレコード上に共有ロックまたは排他ロックを設定するという方法で,行レベルロックを実行します。したがって,行レベルロックは,実際にはインデックスレコードロックです。さらに,あるインデックスレコードに対するネクストキーロックによって,そのインデックスレコードの前の「ギャップ」(对)。つまり,ネクストキーロックは,インデックスレコードロックと,そのインデックスレコードの前のギャップに対するギャップロックとを組み合わせたものです。あるセッションがインデックス内のレコードR
上に共有ロックまたは排他ロックを持っている場合は,別のセッションがインデックスの順番でR
。
InnoDB
はインデックスをスキャンするときに,インデックス内の最後のレコードのあとのギャップをロックすることもできます。★★★★★★★★★★★★★★★★★id
★★★★★★★★★★★★★★★★★★★★InnoDB
★★★★★★★id
。
。共有モードでデータを読み取るときに,挿入される行の重複が見られなければ,行を安全に挿入でき,読み取り中に後続の行に設定されたネクストキーロックによって,任意のユーザーによる重複行の挿入が回避されることを確認できます。したがって,ネクストキーロックを使用すれば,テーブル内に存在しないものも「汪汪汪汪」哇,哇,哇。
,“InnoDB,,,”★★★★★★★★★★★★★★★★ギャップ汪汪汪汪が無効になっていると、ほかのセッションが新しい行をギャップに挿入できるため、ファントムの問題が発生する可能性があります。