マルチバージョン同時実行制御 (MVCC) とは...を指します。 MVCC は同時実行制御方式であり、データベースへの同時アクセスを実現し、プログラミング言語でトランザクション メモリを実装するために、データベース管理システムで一般に使用されます。
MySQL InnoDB での MVCC の実装は、主にデータベースの同時実行パフォーマンスを向上させ、読み取りと書き込みの競合を処理するためのより良い方法を使用することです。これにより、読み取りと書き込みの競合が発生した場合でも、ロックなし、ノンブロッキングの同時読み取り。
共有モードでの選択ロック (共有ロック)、更新用の選択、更新、挿入、削除 (排他的ロック) などの操作はすべて現在の操作です。読書、なぜ現在読書と呼ばれるのでしょうか?つまり、レコードの最新バージョンを読み取ります。読み取り時には、他の同時トランザクションが現在のレコードを変更できないようにする必要があり、読み取られたレコードはロックされます。
ロックを使用しない選択操作はスナップショット読み取り、つまりロックを使用しないノンブロッキング読み取りであり、スナップショット読み取りの前提は分離 レベルはシリアル レベルではありません。シリアル レベルでのスナップショット読み取りは現在の読み取りに縮退します。スナップショット読み取りが発生する理由は、同時実行パフォーマンスの向上を考慮したものです。スナップショット読み取りの実装は、マルチバージョン同時実行制御に基づいています。 MVCC は行ロックの一種であると考えられていますが、複数のバージョンに基づいているため、多くの場合、ロック操作が回避され、オーバーヘッドが軽減されます。つまり、スナップショットの読み取りで必ずしも読み取られるとは限りません。データの最新バージョンですが、以前の履歴バージョンである可能性もあります
MVCC マルチバージョン同時実行制御とは、複数のバージョンのデータを維持することを指します。スナップショット読み取りは、MVCC を実装するための MySQL のノンブロッキング読み取り機能です。 MySQL における MVCC モジュールの具体的な実装は、3 つの暗黙的なフィールド、アンドゥ ログ、および読み取りビューによって実装されます。
mvcc の実装原則は、主に、レコード、アンドゥログ、読み取りビューの 3 つの隠しフィールドに依存します。
隠しフィールド
カスタム フィールドに加えて、行レコードには DB_TRX_ID、DB_ROLL_PTR、DB_ROW_ID、およびデータベースによって暗黙的に定義されたその他のフィールドもあります
DB_TRX_ID
6 バイト (最後に変更されたトランザクション ID) は、このレコードを作成したトランザクション ID、またはこのレコードを最後に変更したトランザクション ID を記録します
DB_ROLL_PTR
7 バイト、ロールバック ポインター、このレコードの前のバージョンを指します。undolog と連携するために使用され、前の古いバージョンを指します。
#DB_ROW_JD6 バイト、非表示主キーデータ テーブルに主キーがない場合、innodb は 6 バイトの row_id
# を自動的に生成します。 ##Undolog はロールバック ログと呼ばれ、ロールバックを容易にするために挿入、削除、および更新操作中に生成されるログを表します。挿入操作の実行時に生成されるアンドゥログは、トランザクションがロールバックされる場合にのみ必要になります。トランザクションはコミット直後に破棄できますが、更新や削除の操作を行う際に生成されるアンドゥログは、トランザクションのロールバック時だけでなく、スナップショットの読み取り時にも必要となるため、安易に削除することはできません。スナップショットが読み取られるか、トランザクションがロールバックされる場合にのみ削除されます。ログが関与していない場合、対応するログはパージ スレッドによって一律にクリアされます (データが更新および削除される場合、古いレコードの delete_bit が設定されるだけです)ディスク領域を節約するために、innodb には deleted_bit true
のレコードをクリアする専用のパージ スレッドがあるため、古いレコードは実際には削除されません。レコードのdeleted_id が true## の場合#、DB_TRX_ID がパージ スレッドの読み取りビューに相対して表示される場合、このレコードは特定の時間にクリアできます)Read View
Read Viewトランザクションがスナップショット読み取り操作を実行するときに生成される読み取りビューです。トランザクションがスナップショット読み取りを実行すると、その時点で、データ システムの現在のスナップショットが生成され、システム内の現在アクティブなトランザクションの ID が生成されます。トランザクションの ID 値が増加しています。 6. MVCC の中心的な考え方
MVCC の中心的な考え方は次のとおりです:MVCC 検索ルール: 作成時間が現在のトランザクション ID 以下であるデータと、削除時間が現在のトランザクション ID よりも長い (または削除されていない) 行のみを検索できます。
図に示すように、Transaction1 トランザクションに 2 つのデータが挿入され、トランザクションが送信されて、次に Transaction2 トランザクションで読み取られ、2 つのデータがトランザクション 1 に挿入されます。
#図に示すように、古い接続のデータを Transaction3 トランザクションに挿入し、それを Transaction2 トランザクションで読み取ります。 mvcc ルールでは、トランザクションの開始後に挿入されたデータが見つかりません。古い接続の作成 ID が 2 より大きいです。したがって、2 つのデータのみが見つかります
図に示すように、トランザクション 4 のトランザクションで ID 2 のデータが削除され、トランザクション 2 のトランザクションで読み込まれます。mvcc ルールに従って、データはその後挿入および削除されます。私のトランザクションの開始を見つけることができますが、Lao Chao はまだ見つけることができるため、彼はまだ 2 つのデータを見つけています
図に示すように、Transaction5 トランザクションに次のコードを追加しますname=Brother Tao のデータ、id= 1 のデータを削除、name=Brother Tao の ID を 1 に変更し、トランザクション 2 で読み取ります。mvcc ルールによれば、トランザクションの開始後に挿入および削除されたデータは、 Lao Yan はまだそれを見つけることができるため、依然として 2 つのデータを見つけます
上記のデモを通じて、他のトランザクションが挿入、変更、または挿入しているかどうかに関係なく、バージョン番号の制御を通じてそれがわかることがわかります。削除しても、Transaction2 トランザクションによってクエリされたデータは変更されません。
以上がMysql MVCC マルチバージョン同時実行制御の知識ポイントは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。