MVCCとは
MVCC(Mutil-版同時実行制御)マルチバージョン同時実行制御の使用を指す二分離レベルコミットリード(READ COMMITTD)および反復可能読み取り(REPEATABLE READ通常SEELCT操作を行う際にアクセス・レコードに)のプロセスバージョンチェーンを、このようにして、異なるトランザクションの読み取り/書き込み操作と書き込み-読み取り操作を同時に実行できるため、システムのパフォーマンスが向上します。
これら2つの分離レベルの大きな違いは、ReadViewの生成タイミングが異なることです。送信された読み取りは、通常のSELECT操作の前にReadViewを生成しますが、繰り返し可能な読み取りは、最初の通常のSELECT操作の前に1つだけ生成します。ReadView、後続のクエリ操作このReadViewを問題なく再利用します。
MVCCをサポートするために、DELETE操作では、レコードに削除マークのみがマークされていますが、実際には削除されていません。ReadViewトランザクションがアクセスされなくなったことを確認すると、バックグラウンドスレッドが削除されます。
バージョンチェーン
InnoDBストレージエンジンの行形式には、次の2つの非表示列があります。
- trx_id:トランザクションがクラスター化インデックスレコードを変更するたびに、トランザクションのトランザクションIDがtrx_id非表示列に割り当てられます。
- roll_pointer:クラスター化インデックスレコードが変更されるたびに、古いバージョンが元に戻すログに書き込まれます。この非表示の列は、レコードの変更前の情報を見つけることができるポインターに相当します。レコードが変更されるたびに、元に戻すログが記録されます。各元に戻すログには、リンクリストを形成するために接続できるroll_pointer属性もあります。このリンクリストはバージョンチェーンと呼ばれ、バージョンチェーンのヘッドノードは現在のレコードの最新の値です。
ReadView
ReadViewには、主に4つの重要なコンテンツが含まれています。
- m_ids:ReadViewが生成されたときに現在のシステムでアクティブな読み取りおよび書き込みトランザクションのトランザクションIDリストを表します。
- min_trx_id:ReadViewが生成されたときの、現在のシステムのアクティブな読み取りおよび書き込みトランザクションの中で最小のトランザクションID、つまりm_idsの最小値を表します。
- max_trx_id:ReadViewが生成されたときにシステム内の次のトランザクションに割り当てられる必要があるID値を示します。
- creator_trx_id:ReadViewを生成したトランザクションのトランザクションIDを表します。
この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の作成時にバージョンを生成したトランザクションがコミットされ、バージョンにアクセスできることを意味します。
特定のバージョンのデータが現在のトランザクションに表示されない場合は、バージョンチェーンに従ってデータの次のバージョンを見つけ、上記の手順に従って表示を判断し続けます。バージョンチェーン。最後のバージョンが表示されない場合は、レコードがトランザクションから完全に表示されておらず、クエリ結果にレコードが含まれていないことを意味します。
トランザクションの同時実行で発生する問題
- ダーティライト:トランザクションは、コミットされていない別のトランザクションによって変更されたデータを変更します。
- ダーティ読み取り:トランザクションは、別のコミットされていないトランザクションによって変更されたデータを読み取ります。
- 繰り返し不可の読み取り:トランザクションは、コミットされた別のトランザクションによって変更されたデータのみを読み取ることができ、他のすべてのトランザクションがデータを変更してコミットした後、トランザクションは最新の値を照会できます。
- ファントム読み取り:トランザクションは最初に特定の条件に基づいていくつかのレコードを照会し、次に別のトランザクションがこれらの条件を満たすレコードをテーブルに挿入します。元のトランザクションが条件に従って再度照会されると、他のトランザクションによって挿入されたレコードも次のようになります。挿入されました。読み上げてください。
4つの分離レベル
- コミットされていない読み取り(READ UNCOMMITTED)は、ダーティ読み取り、繰り返し不可能な読み取り、およびファントム読み取りで発生する可能性があります
- 送信された読み取り(READ COMMITTED)は、繰り返し不可能な読み取り、ファントム読み取りが発生する可能性があります
- 繰り返し可能な読み取り(REPEATABLE READ)は、ファントム読み取りが発生する可能性があります
- シリアル化可能(SERIALIZABLE)すべての種類の問題は発生しません