ホームページ  >  記事  >  データベース  >  Mysql MVCC マルチバージョン同時実行制御の知識ポイントは何ですか?

Mysql MVCC マルチバージョン同時実行制御の知識ポイントは何ですか?

王林
王林転載
2023-05-27 23:31:191095ブラウズ

1. MVCC

マルチバージョン同時実行制御 (MVCC) とは...を指します。 MVCC は同時実行制御方式であり、データベースへの同時アクセスを実現し、プログラミング言語でトランザクション メモリを実装するために、データベース管理システムで一般に使用されます。

MySQL InnoDB での MVCC の実装は、主にデータベースの同時実行パフォーマンスを向上させ、読み取りと書き込みの競合を処理するためのより良い方法を使用することです。これにより、読み取りと書き込みの競合が発生した場合でも、ロックなし、ノンブロッキングの同時読み取り。

2. 現在の内容

共有モードでの選択ロック (共有ロック)、更新用の選択、更新、挿入、削除 (排他的ロック) などの操作はすべて現在の操作です。読書、なぜ現在読書と呼ばれるのでしょうか?つまり、レコードの最新バージョンを読み取ります。読み取り時には、他の同時トランザクションが現在のレコードを変更できないようにする必要があり、読み取られたレコードはロックされます。

3. スナップショット読み取り (データベースの同時クエリ機能の向上)

ロックを使用しない選択操作はスナップショット読み取り、つまりロックを使用しないノンブロッキング読み取りであり、スナップショット読み取りの前提は分離 レベルはシリアル レベルではありません。シリアル レベルでのスナップショット読み取りは現在の読み取りに縮退します。スナップショット読み取りが発生する理由は、同時実行パフォーマンスの向上を考慮したものです。スナップショット読み取りの実装は、マルチバージョン同時実行制御に基づいています。 MVCC は行ロックの一種であると考えられていますが、複数のバージョンに基づいているため、多くの場合、ロック操作が回避され、オーバーヘッドが軽減されます。つまり、スナップショットの読み取りで必ずしも読み取られるとは限りません。データの最新バージョンですが、以前の履歴バージョンである可能性もあります

4、現在の読み取り、スナップショット読み取り、MVCC 関係

MVCC マルチバージョン同時実行制御とは、複数のバージョンのデータを維持することを指します。スナップショット読み取りは、MVCC を実装するための MySQL のノンブロッキング読み取り機能です。 MySQL における MVCC モジュールの具体的な実装は、3 つの暗黙的なフィールド、アンドゥ ログ、および読み取りビューによって実装されます。

5. MVCC 実装原則

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_JD

6 バイト、非表示主キーデータ テーブルに主キーがない場合、innodb は 6 バイトの row_id

undo log

# を自動的に生成します。 ##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 に挿入されます。

Mysql MVCC マルチバージョン同時実行制御の知識ポイントは何ですか?

#図に示すように、古い接続のデータを Transaction3 トランザクションに挿入し、それを Transaction2 トランザクションで読み取ります。 mvcc ルールでは、トランザクションの開始後に挿入されたデータが見つかりません。古い接続の作成 ID が 2 より大きいです。したがって、2 つのデータのみが見つかります

Mysql MVCC マルチバージョン同時実行制御の知識ポイントは何ですか?

図に示すように、トランザクション 4 のトランザクションで ID 2 のデータが削除され、トランザクション 2 のトランザクションで読み込まれます。mvcc ルールに従って、データはその後挿入および削除されます。私のトランザクションの開始を見つけることができますが、Lao Chao はまだ見つけることができるため、彼はまだ 2 つのデータを見つけています

Mysql MVCC マルチバージョン同時実行制御の知識ポイントは何ですか?

図に示すように、Transaction5 トランザクションに次のコードを追加しますname=Brother Tao のデータ、id= 1 のデータを削除、name=Brother Tao の ID を 1 に変更し、トランザクション 2 で読み取ります。mvcc ルールによれば、トランザクションの開始後に挿入および削除されたデータは、 Lao Yan はまだそれを見つけることができるため、依然として 2 つのデータを見つけます

上記のデモを通じて、他のトランザクションが挿入、変更、または挿入しているかどうかに関係なく、バージョン番号の制御を通じてそれがわかることがわかります。削除しても、Transaction2 トランザクションによってクエリされたデータは変更されません。

以上がMysql MVCC マルチバージョン同時実行制御の知識ポイントは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。