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

推薦する

重複したMySQLレコードを現場でチェックし、処理する実践的な記録

目次序文分析するデータ合計繰り返し率どこにあるかと持っているかの違い要約する序文私はソフトウェアの導...

PHP スケジュールバックアップ MySQL および mysqldump 構文パラメータの詳細

まず、MySQL バックアップ コマンド mysqldump の一般的な操作例をいくつか紹介します。...

クールな充電アニメーションを実現する純粋なCSS

CSS のみを使用してどのような充電アニメーション効果を作成できるかを見てみましょう。バッテリーを...

ページ リファクタリング スキル - Javascript、CSS

JS、CSSについてCS: ...上部のスタイルシートCSS式を避ける外部JS、CSSの使用JSと...

vue3とvue2の利点の比較

目次利点1: diffアルゴリズムの最適化利点2: ホイスト静的静的リフティング利点3: cache...

Nginx で Brotli 圧縮アルゴリズムを有効にする方法の例

Brotli は、Zopfli よりも 20 ~ 26% 高い圧縮率を実現できる新しいデータ形式です...

VueはPCで写真をアップロードする機能を実現

この記事の例では、PC上で写真アップロード機能を実現するためのVueの具体的なコードを参考までに共有...

RedisとMySQLの違いを簡単に説明してください

MySQL はディスクに保存される永続的なストレージであり、取得には一定の IO が伴うことはご存じ...

Elasticsearchツールcerebroのインストールと使用チュートリアル

Cerebro は、Elasticsearch バージョン 5.x より前の Elasticsear...

Docker に MySQL と MariaDB をインストールする方法

MySQLとMariaDBの関係MariaDB データベース管理システムは MySQL のブランチで...

CentOS 7.4 64 ビット版に MySQL 8.0 をインストールして設定するための詳細な手順

ステップ1: MySQL YUMソースを取得するMySQLの公式サイトにアクセスして、RPMパッケー...

ハイパーリンクに関するいくつかの質問

ポテトチップスパーティーのこのエピソードに参加して、何人かの友人に会えてとても嬉しいです。思いがけず...

文字列から指定された文字を削除または抽出する JavaScript メソッド (非常によく使用されます)

目次1. 部分文字列() 2. サブストラクチャ() 3.インデックス() 4.最後のインデックス(...

空のパスがページのパフォーマンスに与える影響に対する解決策

数日前、Google Reader で Yu Bo さんが共有した投稿「空のパスがページのパフォーマ...

MyBatisインターセプターのページング機能を実装する方法

MyBatisインターセプターのページング機能を実装する方法序文:まず、実装原則についてお話しします...