目次- トランザクション分離レベル
- 同時トランザクション実行中に発生した問題
- SQL標準の4つの分離レベル
- MySQLでサポートされている4つの分離レベル
- MVCC原則
- バージョンチェーン
- 閲覧ビュー
- MySQL の RR レベルでのファントム リードを解決する方法
トランザクション分離レベル
同時トランザクション実行中に発生した問題
- ダーティライト
- トランザクションが、コミットされていない別のトランザクションによって変更されたデータを変更する場合、ダーティ ライトが発生したことを意味します。
- ダーティリード
- トランザクションが、コミットされていない別のトランザクションによって変更されたデータを読み取る場合、ダーティ リードが発生したことを意味します。
- 繰り返し不可能な読み取り
- トランザクションが別のコミットされたトランザクションによって変更されたデータのみを読み取ることができ、他のトランザクションがデータを変更してコミットするたびに最新の値を照会できる場合、反復不可能な読み取りが発生したことを意味します。
- ファントムリード
- あるトランザクションが最初に特定の条件に基づいていくつかのレコードを照会し、次に別のトランザクションがこれらの条件を満たすレコードをテーブルに挿入した場合、元のトランザクションが条件に従って再度照会すると、別のトランザクションによって挿入されたレコードも読み取られる可能性があり、ファントム読み取りが発生したことを意味します。
- ファントム リードは、トランザクションが同じ条件に従ってレコードを複数回読み取る場合、後の読み取りでは以前に読み取られなかったレコードが読み取られることを強調します。
- 以前に読み取られたレコードを後で読み取ることができない場合はどうなりますか?実際、これは各レコードに対して繰り返し不可能な読み取りが行われることと同じです。ファントム リードは、以前の読み取りで取得されなかったレコードが読み取られたことを強調するだけです。
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
|