MySQL トランザクション分離レベルと MVCC の詳細な説明

MySQL トランザクション分離レベルと MVCC の詳細な説明

トランザクション分離レベル

同時トランザクション実行中に発生した問題

  • ダーティライト
    • トランザクションが、コミットされていない別のトランザクションによって変更されたデータを変更する場合、ダーティ ライトが発生したことを意味します。
  • ダーティリード
    • トランザクションが、コミットされていない別のトランザクションによって変更されたデータを読み取る場合、ダーティ リードが発生したことを意味します。
  • 繰り返し不可能な読み取り
    • トランザクションが別のコミットされたトランザクションによって変更されたデータのみを読み取ることができ、他のトランザクションがデータを変更してコミットするたびに最新の値を照会できる場合、反復不可能な読み取りが発生したことを意味します。
  • ファントムリード
    • あるトランザクションが最初に特定の条件に基づいていくつかのレコードを照会し、次に別のトランザクションがこれらの条件を満たすレコードをテーブルに挿入した場合、元のトランザクションが条件に従って再度照会すると、別のトランザクションによって挿入されたレコードも読み取られる可能性があり、ファントム読み取りが発生したことを意味します。
    • ファントム リードは、トランザクションが同じ条件に従ってレコードを複数回読み取る場合、後の読み取りでは以前に読み取られなかったレコードが読み取られることを強調します。
    • 以前に読み取られたレコードを後で読み取ることができない場合はどうなりますか?実際、これは各レコードに対して繰り返し不可能な読み取りが行われることと同じです。ファントム リードは、以前の読み取りで取得されなかったレコードが読み取られたことを強調するだけです。

SQL標準の4つの分離レベル

  • READ UNCOMMITTED: コミットされていないダーティリード、非反復リード、ファントムリードが発生します
  • READ COMMITTED: コミットされた読み取り、反復不可能な読み取り、ファントム読み取りが発生する
  • 繰り返し読み取り: 繰り返し読み取りファントム読み取りが発生する
  • SERIALIZABLE: 直列化可能性は発生しません

MySQLでサポートされている4つの分離レベル

  • MySQL は、REPEATABLE READ 分離レベルでファントム リードを防止できます (ファントム リードを防止する方法については後で説明します)。
  • MySQLのデフォルトの分離レベルはREPEATABLE READです。

MVCC原則

バージョンチェーン

InnoDB ストレージ エンジンを使用するテーブルの場合、クラスター化インデックス レコードには 2 つの必要な非表示列が含まれます。

  • trx_id: トランザクションがクラスター化インデックス レコードを変更するたびに、トランザクションのトランザクション ID が trx_id 隠し列に割り当てられます。
  • roll_pointer: クラスター化インデックス レコードが変更されるたびに、古いバージョンが UNDO ログに書き込まれ、この非表示の列はポインターと同等になり、レコードが変更される前の情報を見つけるために使用できます。

閲覧ビュー

  • READ UNCIMMITTED 分離レベルを使用するトランザクションの場合、コミットされていないトランザクションによって変更されたレコードを読み取ることができるため、レコードの最新バージョンを直接読み取ることができます。
  • READ COMMITTED および REPEATABLE READ 分離レベルを使用するトランザクションの場合、コミットされたトランザクションによって変更されたレコードが確実に読み取られる必要があります。つまり、別のトランザクションがレコードを変更したがまだコミットされていない場合、レコードの最新バージョンを直接読み取ることはできません。中心的な問題: バージョン チェーン内のどのバージョンが現在のトランザクションに表示されるかを判断する必要があります。 ReadViewはこの目的のために設計されています
  • readView には 4 つの重要なコンテンツが含まれています。
    • m_ids: ReadView が生成された時点での現在のシステム内のアクティブな読み取りおよび書き込みトランザクションのトランザクション ID を示します。
    • min_trx_id: ReadView が生成された時点での現在のシステム内のアクティブな読み取りおよび書き込みトランザクションの中で最小のトランザクション ID、つまり m_ids の最小値を示します。
    • max_trx_id: ReadViewを生成するときにシステム内の次のトランザクションに割り当てるID値を示します。
    • Creator_trx_id: ReadViewを生成したトランザクションのトランザクションIDを示します。
      • 前に述べたように、トランザクション ID は、テーブル内のレコードに変更が加えられたとき (INSERT、DELETE、UPDATE ステートメントが実行されたとき) にのみトランザクションに割り当てられます。それ以外の場合、読み取り専用トランザクションのトランザクション ID 値はデフォルトで 0 になります。
  • この ReadView を使用すると、レコードにアクセスするときに、レコードのバージョンが表示されているかどうかを判断するには、次の手順に従うだけで済みます。
    • アクセスされたバージョンの trx_id 属性が ReadView の Creator_trx_id と同じである場合、現在のトランザクションが変更したレコードにアクセスしているため、現在のトランザクションからそのバージョンにアクセスできることを意味します。
    • アクセスされた trx_id 属性値が ReadView の min_trx_id 値より小さい場合、現在のトランザクションが ReadView を生成するときにこのバージョンを生成したトランザクションがコミットされていることを示します。そのため、このバージョンは現在のトランザクションからアクセスできます。
    • アクセスされたバージョンの trx_id 属性値が ReadView の max_trx_id 値以上である場合、このバージョンを生成したトランザクションは現在のトランザクションが ReadView を生成した後に開かれたため、このバージョンには現在のトランザクションからアクセスできないことを意味します。
    • アクセスされたバージョンの trx_id 属性値が ReadView の min_trx_id と max_trx_id の間にある場合、trx_id 属性値が m_ids リスト内にあるかどうかを判断する必要があります。ある場合、ReadView の作成時にバージョンを生成したトランザクションがまだアクティブであり、バージョンにアクセスできないことを意味します。ない場合は、ReadView の作成時にバージョンを生成したトランザクションがコミットされており、バージョンにアクセスできることを意味します。

要約すると:

  • READ COMMITTED 分離レベルのトランザクションは、各クエリの開始時に個別の ReadView を生成します。
  • REPEATABLE READ: 初めてデータを読み取るときに ReadView を生成します。つまり、2 つの SELECT クエリから取得された結果が重複します。

MVCC の概要: いわゆる MVCC は、READ COMMITTED および REPEATABLE READ 分離レベルでトランザクションを使用して通常の SELECT 操作を実行するときに、レコードのバージョン チェーンにアクセスするプロセスを指します。これにより、異なるトランザクションの読み取り書き込み操作と書き込み読み取り操作を同時に実行できるようになり、パフォーマンスが向上します。

MySQL の RR レベルでのファントム リードを解決する方法

1. 現在読み込んでいる最新バージョンを読み取り、対応するレコードのロックを取得する必要があります。次のSQLに示すように

  • 選択...共有モードでロック
  • 更新するには...を選択してください
  • 更新、削除、挿入

ファントムリーディングは、次のキーを通じて実現されます

2. スナップショットの読み取りはmvccによって解決されます

以上がMySQLトランザクションの分離レベルとMVCCの詳細な説明です。MySQLトランザクションの分離レベルとMVCCの詳細については、123WORDPRESS.COMの他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQL MVCCメカニズム原理の詳細な説明
  • MySQL トランザクション分離はどのように実現されますか?
  • MySQL トランザクション分離レベルとロックメカニズムの問題に関する深い理解
  • MySql8.0 のトランザクション分離レベルエラーの問題を解決する
  • MySQL マルチバージョン同時実行制御 MVCC の基本原理の分析
  • MySQL マルチバージョン同時実行制御 MVCC の実装
  • Mysql MVCC マルチバージョン同時実行制御の詳細
  • MYSQL トランザクション分離レベルと MVCC

<<:  マージンのマージの問題を解決する

>>:  Docker を使用した Redis マスタースレーブレプリケーションの実践の詳細説明

推薦する

複数のドメイン名、ポート、IP仮想ホストに基づくNginx構成

1. タイプの導入1.1 ドメインベースの仮想ホスティングいわゆるドメイン名ベースの仮想ホストとは、...

Kylin V10 への zabbix-agent のインストール手順

1. インストールパッケージをダウンロードするダウンロードアドレス: https://sourcef...

layui をベースにしたログインページの実装

この記事の例では、ログインページを実装するためのlayuiの具体的なコードを参考までに共有しています...

Nginx プロキシを使用してインターネットを閲覧する方法

私は通常、Tomcatや他のアプリケーションのリバースプロキシとしてnginxを使用しています。実際...

Ubuntu で時刻同期に NTP を使用する

NTP は、ネットワーク上で時間を同期するための TCP/IP プロトコルです。通常、クライアントは...

mysql 5.7.11 winx64.zip インストールと設定方法のグラフィックチュートリアル

MySql データベース システムをインストールして構成します。 1. ダウンロード http://...

リモート接続を許可するようにMySQLを変更する方法

MySQLリモート接続の問題に関しては、会社で働いているときに誰かのコンピュータに保存されているMy...

Web ページ制作におけるテーブル属性 CellPad、CellSpace、Border の説明と使用

cellspacing は表内のセル間の距離です。セルパディングは、表のセル内の空白スペースです。一...

HTMLテーブルタグの詳しい解説(初心者向け)

表> <TR> <TD> <TH> <キャプション&...

Vueプロジェクトでvuexを使用する方法

目次Vuex とは何ですか? Vuex 使用サイクル図私のストアディレクトリvuexの例の実装要約す...

JSを段階的に学ぶ方法についての簡単な説明

目次概要1. jsの位置づけを明確に理解する2. 明確な学習パス3. 自己規律と粘り強さ4. 練習し...

HTMLはa要素hrefのURLリンクを自動的に更新したり新しいウィンドウを開いたりする機能を実装する

場合によっては、次のような機能を実装したいことがあります。リンクをクリックします。リンクがブラウザで...

Vue 仮想 DOM クイックスタート

目次仮想DOM仮想DOMとは何か仮想DOMの役割Vue の仮想 DOM vノードvNodeとはvNo...

シンプルな計算機を実装する JavaScript コード

この記事では、参考までに、簡単な計算機を実装するためのJavaScriptの具体的なコードを紹介しま...

MySQL フルテキスト検索の中国語ソリューションとサンプルコード

MySQL 全文検索中国語ソリューション最近、会社のプロジェクトで、データベースで中国語を検索する機...