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 の位置をドラッグして入れ替える例
この記事では、クラス抽選アプレットを実装するためのJavaScriptの具体的なコードを参考までに紹...
組織内で何らかのパスワード ポリシーがすでに実装されている場合は、この記事を読む必要はありません。た...
最近のプロジェクトでフォームを作成するときに、コメント ボックスまで自動的にスクロールし、コメント ...
FFmpeg flacをインストールする eric@ray:~$ sudo apt install ...
この記事では、例を使用して、MySQL ユーザー権限を確認および管理する方法を説明します。ご参考まで...
bgcolor="テキストの色" background="背景画像&q...
この記事では、参考までに、JSでスネークゲームを書くための具体的なコードを紹介します。具体的な内容は...
この記事では、 Dockerコンテナ ( docker-composeを使用してオーケストレーション...
<br />この記事では、XHTMLとXHTMLの基礎知識について簡単に紹介します。 X...
目次1. プロジェクト環境: 2: DNSサーバーの設定i: 前方解析を構成する: ii: 逆解像度...
目次序文: 1. デフォルト値に関する操作2. 使用上の提案要約:序文: MySQL では、テーブル...
<br />この記事では、開発者ツールのさまざまなメニューについて簡単に説明しました。こ...
この記事では、Navicatを使用してcsvデータをmysqlにインポートする方法を参考までに紹介し...
目次1. Vueフロントエンドを構成する1. クロスドメイン構成を開発する2. 本番環境のクロスドメ...
問題の説明最近、MySQL5.6.21サーバーがありました。アプリケーションがリリースされた後、同時...