1. ファントムリーディングとは何ですか? トランザクションにおいて、複数のクエリの後に結果セットの数が不一致になる状況をファントム リードと呼びます。 余分な行または欠落した行はファントム行と呼ばれます。 2. なぜファントムリーディングを解決する必要があるのでしょうか? 同時実行性の高いデータベース システムでは、トランザクション間の分離とトランザクション自体の一貫性を確保する必要があります。 3. MySQL はファントム リーディングをどのように解決しますか? この記事をご覧になった方は、ダーティ リード、非反復リード、反復可能リードについて理解されているものとみなします。 1. マルチバージョン同時実行制御 (MVCC) (スナップショット読み取り) ほとんどのデータベースはマルチバージョン同時実行制御を実装しており、これを実現するためにデータのスナップショットを保存しています。 InnoDB を例にとると、各行に 2 つの冗長バイトが追加されます。 1 つは行の作成バージョンであり、もう 1 つは行の削除 (期限切れ) バージョンです。バージョン番号はトランザクションごとに増加します。トランザクションがデータを取得するたびに、作成バージョンが現在のトランザクション バージョンより小さいデータと、期限切れバージョンが現在のバージョンより大きいデータが取得されます。 通常の選択はスナップショット読み取りです。 番号が 1 である T から * を選択します。 原則: 履歴データのスナップショットが保存されるため、他のトランザクションによって追加または削除されたデータは現在のトランザクションには表示されません。 2. 次のキーロック(現在の読み取り) ネクストキーロックは 2 つの部分で構成されています。
レコード ロックはインデックスに追加されるロックであり、ギャップ ロックはインデックス間に追加されるロックです。 (考えてみてください: 列にインデックスがない場合、どうなるでしょうか?) 更新のために、番号が 1 である T から * を選択します。 select * from T where number = 1 共有モードでロックします。 入れる アップデート 消去 原則: 現在のデータ行と前のデータ行および次のデータ行の間のギャップをロックして、この範囲内で読み取られたデータの一貫性を確保します。 その他: MySQL InnoDB エンジンの RR 分離レベルはファントム リードを解決しますか? github のコメント アドレスを参照してください: MySQL によるファントム リードの公式説明は、トランザクションの 2 番目の選択に余分な行がある限り、ファントム リードと見なされるというものです。 この場合、MySQL の RR レベルではファントム リードを防ぐことはできません。 友人がそのアドレスに返信しました: スナップショット読み取りの場合、MySQL はファントム読み取りを回避するために mvcc を使用します。 スナップショット読み取りと現在の読み取りの結果が異なる状況は、ファントム読み取りとは見なされません。これらは 2 つの異なる用途です。したがって、MySQL の rr レベルはファントム リーディングの問題を解決すると思います。 まず結論を述べます。MySQL ストレージ エンジン InnoDB 分離レベル RR はファントム リード問題を解決します。 前回の質問にもありましたが、select後にT1が更新されるとT2に挿入されたデータも一緒に更新されるため、余分な行があると考えられるためファントムリードは防げません。このステートメントは申し分ないように思えますが、実際は間違っています。InnoDB には、スナップショット読み取りと現在の読み取りの 2 つのモードがあります。スナップショット読み取りのみの場合、当然ファントム読み取りの問題はありません。ただし、ステートメントが現在の読み取りに昇格された場合、T1 は選択時に次の構文を使用する必要があります: select * from t for update (lock in share mode) を使用して現在の読み取りに入ると、当然 T2 がデータを挿入できるということはあり得ません。 知らせ 上記は、MySQL がファントム リードを解決する方法についての詳細な説明です。お役に立てれば幸いです。ご質問がある場合は、メッセージを残していただければ、すぐに返信いたします。また、123WORDPRESS.COM ウェブサイトをサポートしてくださっている皆様にも感謝申し上げます。 以下もご興味があるかもしれません:
|
<<: Ubuntu 18.0.4 は mysql をインストールし、エラー 1698 (28000): ユーザー ''root''@''localhost'' のアクセスが拒否されましたを解決します
>>: JavaScript を使用して div の位置をドラッグして入れ替える例
clear:both清除浮動これは私が常に持っていた印象ですが、私はこれをめったに使用せず、私の理...
この記事では、キャンバスを使用して画像圧縮アップロードを実現するVueの具体的なコードを参考までに共...
nginx.conf設定ファイルは次のとおりです。 ユーザー nginx; ワーカープロセス 1; ...
結果から判断すると、タイトルを定義するための固定パターンはなく、すべてむしろランダムな感じがします。...
目次ZabbixはNginxを監視するZabbixはTomcatを監視するZabbixはMySQLを...
目次1. コンポーネントでの使用2. オプションのマージ要約する1. コンポーネントでの使用Mixi...
MySQLデータベースを完全にアンインストールするプロセスは次のとおりです。 1. MySQLサービ...
1. まず、お使いのマシンに応じて、MySQL 公式サイトから対応するデータベースをダウンロードしま...
目次502 不正なゲートウェイ エラーの発生1. 502 不正なゲートウェイ エラーとは何ですか? ...
MySQL を使用して中国語の文字を挿入すると、多くの友人から次のエラーが報告されます。 これは、文...
InnoDB インデックスの物理構造すべての InnoDB インデックスは Btree インデックス...
この記事は主に、Vue のレスポンシブ ソース コードを理解していない、または触れたことがない人向け...
目次1. 事例紹介2. システムのデフォルトのストレージエンジンとデフォルトの文字セットを表示する3...
構文フォーマット: row_number() over(partition by grouping ...
この記事では、参考までにMySQL8.0.11のインストールと設定方法、およびMySQL8.0の新し...