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 マスタースレーブレプリケーションの実践の詳細説明

推薦する

Vueモバイル端末に最適な適応ソリューションについての簡単な説明

序文: 最近の医療モバイル プロジェクトに基づいて、Vue はさまざまな画面のさまざまな画面サイズに...

Centos7 ベースの Varnish キャッシュ プロキシ サーバーを展開する

1. ワニスの概要1. ワニスの紹介Varnish は、新しいソフトウェア アーキテクチャを使用し、...

Win10 DVWA のダウンロード、インストール、構成のグラフィック チュートリアルの詳細な説明 (初心者向け学習侵入)

コンピュータ システムが再インストールされ、侵入テスト学習環境 DVWA を再インストールする必要が...

CSS 属性値 clear:right が機能しない理由の詳細

clear プロパティを使用してフロートをクリアすることはよくあることであり、clear プロパティ...

WeChatアプレットが9マスグリッド効果を実現

この記事では、WeChatアプレットの9マスグリッド効果を実現するための具体的なコードを参考までに紹...

JDカルーセル効果を実現するための純粋なHTMLとCSS

JD カルーセルは、動的な効果を追加せず、主に位置決めの知識を使用して、純粋な HTML と CS...

js キャンバスで円形の水のアニメーションを実現

この記事の例では、円形の水のアニメーションを実現するためのキャンバスの具体的なコードを参考までに共有...

Vueでデータ例を定義する方法

序文開発プロセスにおいて、変数の定義は非常に頻繁かつ基本的なタスクです。変数の使用シナリオと範囲に応...

CSS テキスト装飾 text-decoration と text-emphasis の詳細な説明

CSS では、テキストは私たちが毎日扱う最も一般的なものの 1 つです。テキストの場合、テキストの装...

React Native環境のインストールプロセス

react-native インストールプロセス1.npx react-native init Awe...

インタビューの質問: ホーリー グレイル レイアウトとダブル ウィング レイアウトの違い

序文今日は、聖杯レイアウトとダブルウィングレイアウト、そしてそれらの違いについてお話しします。この2...

editplus の Zen コーディング例コードの説明

たとえば、次のように入力します。 XML/HTML コードdiv#ページ>(div#ヘッダー&...

MySQL の左結合操作における on 条件と where 条件の違いの紹介

優先度両方のケースで同じ条件を設定すると、異なる結果セットが生成される可能性があるのは、優先順位のた...

MySQLでヘッダー付きのCSVファイルをエクスポートする方法

公式ドキュメント http://dev.mysql.com/doc/refman/5.7/en/se...

Docker Swarmの概念と使用法の詳細な説明

Docker Swarm は、Docker によって開発されたコンテナ クラスター管理サービスです。...