この記事では、MVCC のスナップショットを理解し、MVCC でスナップショットがどのように機能するかを説明します。皆さんのお役に立てれば幸いです!
MySQL (innodb ストレージ エンジン) では、実際、各レコードは更新されると同時にロールバック操作を記録します。レコード上の最新の値は、前の状態の値をロールバックすることで取得できます。
値が 1 から 2、3、4 に順番に変更されたとすると、ロールバック ログに次のようなレコードが記録されます。
現在の値は 4 ですが、このレコードをクエリすると、異なる時間に開始されたトランザクションは異なる読み取りビューを持つことになります。図からわかるように、ビュー A、B、および C では、このレコードの値はそれぞれ 1、2、および 4 です。同じレコードがシステム内の複数のバージョンに存在することができます。データベースのバージョン同時実行制御 (MVCC)。)。読み取りビュー A で 1 を取得するには、図内のすべてのロールバック操作を実行して現在の値を取得する必要があります。
InnoDB の各トランザクションには、トランザクション ID と呼ばれる一意のトランザクション ID があります。 これはトランザクションの開始時に InnoDB トランザクション システムに適用され、厳密に適用の順序で増加します。
データの各行にも複数のバージョンがあります。トランザクションがデータを更新するたびに、新しいデータ バージョンが生成され、transaction id がこのデータ バージョンのトランザクション ID に割り当てられ、行 trx_id として記録されます。 同時に、古いデータバージョンを保持し、新しいデータバージョンでは直接取得できる情報が存在する可能性があります。
言い換えると、データ テーブル内のレコードの行には実際には複数のバージョン (行) が存在する可能性があり、各バージョンには独自の行 trx_id があります。
Repeatable Read の定義によると、トランザクションが開始されると、送信されたすべてのトランザクション結果が表示されます。ただし、このトランザクションの実行中は、他のトランザクションからの更新は認識されません。
したがって、トランザクションは開始時に次のように宣言するだけで済みます。「開始した瞬間に基づいて、開始前にデータ バージョンが生成されていれば認識されます。開始すると、それが生成されれば認識されます。」後で認識できなくなります。以前のバージョンを見つけなければなりません。」もちろん、「前のバージョン」も表示されない場合は、前を向き続ける必要があります。また、データがトランザクション自体によって更新された場合でも、それを認識する必要があります。
実装に関しては、InnoDB はトランザクションごとに配列を構築し、トランザクションが開始された時点で現在「アクティブ」であるすべてのトランザクション ID を保存します。 「アクティブ」とは、開始されているがまだ送信されていないことを意味します。
配列内のトランザクション ID の最小値が低水位として記録され、現在のシステムで作成されたトランザクション ID の最大値に 1 を加えた値が記録されます。高水位として。
このビュー配列は、すべての行 trx_id をいくつかの異なる状況に分割します。
このように、現在のトランザクションの開始時点では、データ バージョンの行 trx_id には次の可能性があります。
緑の部分に該当する場合は、このバージョンが送信されたトランザクションであるか、現在のトランザクション自体によって生成され、このデータが表示されることを意味します。赤色の部分は、このバージョンが将来開始されるトランザクションによって生成され、確実に表示されないことを意味します;
a. 行 trx_id が配列内にある場合、このバージョンはまだ送信されていない非表示のトランザクションによって生成されたことを意味します;
b. 行 trx_id が配列にない場合は、このバージョンが送信されたトランザクションであることを意味します。例:このとき、トランザクション A のビュー配列は [90 93 95 100] のようになります。ここで、低水位は 90、高水位は 100 です 1= 101;この場合、トランザクション A の ID は 100 です。
セッション A はトランザクション A を開始します。トランザクション A が開始される前に、システムには ID 90 93 95 の 3 つのアクティブなトランザクションがあります。
トランザクション A がデータの読み取りを開始します
- ID が 104 で、最高水位の 101 より大きい場合、このバージョンは将来開始されるトランザクションによって生成され、確実に不可視であることを意味します。
- ID が 88 であり、最低水位の 90 より小さいということは、このバージョンが送信されたトランザクションであるか、現在のトランザクション自体によって生成され、このデータが表示されることを意味します;
- ID は 94 (低水位と高水位の間にある) であることがわかりますが、配列 [90 93 95 100] には含まれていないため、このバージョンは送信されたトランザクションによって生成されたことを意味します。が見える。
- ID は 93 で、低水位と高水位の間にあると読みました。この [90 93 95 100] 配列は、このバージョンがまだ送信されていないトランザクションによって生成されたことを示しています
この判定ルールはコードロジックをそのまま翻訳したものですが、見ての通り人体分析の可視化に使うには面倒です。
それでは、翻訳させていただきます。データ バージョンやトランザクション ビューの場合、常に表示される独自の更新に加えて、次の 3 つの状況があります:
バージョンはコミットされておらず、非表示です。
以上がMVCC でスナップショットを簡単に分析し、スナップショットがどのように機能するかを確認してください。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。