MySQL マルチバージョン同時実行制御 MVCC の詳細な研究

MySQL マルチバージョン同時実行制御 MVCC の詳細な研究

MVCC

MVCC (Multi-Version Concurrency Control) は、マルチバージョン同時実行制御です。トランザクションの同時実行性とロールバックを実現するのは InnoDB の重要な機能です。ロック メカニズムは同時操作を制御できますが、システム オーバーヘッドが大きく、ほとんどの場合、行レベルのロックは MVCC に置き換えられます。MVCC を使用すると、システム オーバーヘッドを削減できます。

具体的な実装としては、データベースの各行に次の 3 つのフィールドを追加します。

  1. DB_TRX_ID : 行を挿入または更新した最後のトランザクションのトランザクションIDを記録します。
  2. DB_ROLL_PTR: 行の変更に対応するアンドゥログへのポインタ
  3. DB_ROW_ID: 単調に増加するID。AUTO_INCREMENTの主キーIDです。

スナップショット読み取り

たとえば、ロックされていない選択操作はスナップショット読み取りです。スナップショット読み取りの出現は、同時実行パフォーマンスの向上を考慮した上で行われました。スナップショット読み取りの実装は、マルチバージョン同時実行制御、つまり MVCC に基づいています。 MVCC は行ロックの変形と考えることができます。多くの場合、ロック操作を回避し、オーバーヘッドを削減します。複数のバージョンに基づいているため、スナップショット読み取りでは必ずしも最新バージョンのデータが読み取られるわけではなく、以前の履歴バージョンが読み取られる場合があります。

現在の読書

読み取られるのは現在のデータであり、トランザクションが開始される前の状態まで遡るために UNDO ログを使用する必要はありません。読み取られるのはレコードの最新バージョンです。読み取り時には、他の同時トランザクションが現在のレコードを変更できないようにする必要があり、読み取られたレコードはロックされます。

データベースの同時実行シナリオには次の 3 つがあります。

  • 読み取り-読み取り: 問題なし、同時実行制御は不要
  • 読み取り/書き込み: スレッドの安全性の問題があり、トランザクション分離の問題が発生したり、ダーティ リード、ファントム リード、反復不可能なリードが発生したりする可能性があります。
  • 書き込み-書き込み: スレッドの安全性の問題があり、更新損失の問題が発生する可能性があります。たとえば、最初のタイプの更新損失と2番目のタイプの更新損失などです。

簡単に言えば、MVCC はロックなしで読み取り書き込み競合を実現することであり、この読み取りは現在の読み取りではなくスナップショット読み取りを指します。現在の読み取りは実際にはロック操作であり、悲観的ロックの実装です。

MVCC の登場は、大手企業が悲観的ロックを使用して読み取り/書き込み競合の問題を解決することに満足しなかったためであり、次の 2 つの解決策があります。

  • MVCC + 悲観的ロック
    MVCCは読み取り書き込み競合を解決し、悲観的ロックは書き込み書き込み競合を解決します。
  • MVCC + 楽観的ロック
    MVCCは読み取り書き込み競合を解決し、楽観的ロックは書き込み書き込み競合を解決します。

MVCC 実装原則

3つの隠しフィールド

  • 翻訳元
    6 バイト、最終変更 (変更/挿入) トランザクション ID: このレコードを作成したトランザクション ID またはこのレコードを最後に変更したトランザクション ID を記録します。
  • DB_ROLL_PTR
    7 バイト、ロールバック ポインタ、このレコードの前のバージョンを指す (ロールバック セグメントに格納されている)
  • DB_ROW_ID
    6バイト、暗黙的な自動増分ID(隠し主キー)。データテーブルに主キーがない場合、InnoDBはDB_ROW_IDを使用してクラスター化インデックスを自動的に生成します。

バージョンチェーン/元に戻すログ

これは、UNDO ログにトランザクション前のデータの古いバージョンが記録され、行レコード内のロールバック ポインターが古いバージョンの位置を指すため、バージョン チェーンが形成されるためです。読み取りビューは、特定の条件を満たす DB_TRX_ID が見つかるまで、リンク リスト内の DB_TRX_ID を走査し続けます。そうすると、DB_TRX_ID が配置されている古いレコードが、現在のトランザクションが参照できる最新の「古いバージョン」になります。

閲覧ビュー

トランザクションが開かれたときに現在アクティブなすべてのトランザクション (コミットされていないトランザクション) のコレクションです。つまり、読み取りビューは、トランザクションがスナップショット読み取り操作を実行したときに生成される読み取りビューです。トランザクションによってスナップショット読み取りが実行された瞬間に、現在のデータベース システムのスナップショットが生成され、システム内の現在のアクティブなトランザクションの ID が記録および維持されます。

3 つの重要な読み取りビュー構造:

  • trx_list (私がランダムに命名)
    読み取りビューが生成された時点でシステム内でアクティブなトランザクションIDのリストを維持するために使用される値のリスト
  • アップリミットID
    trx_list リスト内の最小のトランザクション ID
  • 下限ID

ReadView生成時にシステムによって割り当てられていない次のトランザクションID。これは、これまでに出現したトランザクションIDの最大値+1です。

なぜ low_limit なのでしょうか? これは、システムが現時点で割り当てることができるトランザクション ID の最小値でもあるためです。

MVCC 実装の全体的なプロセス:

要約する

  • 同時実行性の高いトランザクションの場合、MVCCは単純なロックよりも効率的です。
  • MVCC は、Read Committed と Repeatable Read の 2 つの分離レベルでのみ機能します。
  • 読み取りコミット分離レベルでは、スナップショット読み取り (クエリ) ごとに読み取りビューが生成されます。繰り返し読み取りでは、トランザクションの開始時にのみ読み取りビューが生成され、この読み取りビューは後続の各クエリで使用され、異なる分離レベルが実現されます。

参照:

[MySQL ノート] MySQL の MVCC と実装原則を正しく理解する (推奨)

MySQL · エンジン機能 · InnoDB トランザクション システム (taobao.org)

mvcc の詳細な説明 - Jianshu (jianshu.com)

これで、MySQL のマルチバージョン同時実行制御 MVCC の詳細な研究に関するこの記事は終了です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援して頂ければ幸いです。

以下もご興味があるかもしれません:
  • MySQLクエリキャッシュメカニズムの基礎学習チュートリアル
  • MySQL セレクトキャッシュメカニズムの使用に関する詳細な説明
  • MySQL マルチバージョン同時実行制御 MVCC の基本原理の分析
  • MySQL マルチバージョン同時実行制御 MVCC の実装
  • MYSQL トランザクション分離レベルと MVCC
  • MySQL の MVCC と BufferPool キャッシュ メカニズムの詳細な理解

<<:  HTML でマウスが停止したときに行全体の色 (tr) を変更する方法

>>:  CSS3 トランジション回転パースペクティブ 2D3D アニメーションおよびその他の効果のサンプル コード

推薦する

ナビゲーションバーのドロップダウンメニューのサンプルコードを実装するためのHTML+CSS

効果コード内の画像は自分で変更できますドロップダウンメニューのHTMLコード <ヘッダークラ​...

MySQL 5.6 のインストール手順(画像とテキスト付き)

MySQL はオープンソースの小規模リレーショナル データベース管理システムです。現在、MySQL...

XHTML 入門チュートリアル: リストタグの使用

リストは、類似または関連する一連の項目をリストするために使用されます。順序なしリスト(箇条書きリスト...

MySQLデータのグループ化の詳細な説明

グループを作成グループ化は、SELECT ステートメントの GROUP BY 句で設定されます。例:...

HTML ページでコンテンツの選択、コピー、右クリックを防止する方法の詳細な説明

時には、Web ページに掲載されているコンテンツが悪意のある人物に盗用されるのを望まないため、Web...

自分のブログを構築しながら学んだこと

<br />ブログを始めて 1 年、私はブログの内外で多くのことを個人的に学びました。ま...

Linux コマンドラインでメールを送信する 5 つの方法 (推奨)

シェル スクリプトで電子メールを作成する必要がある場合は、コマンド ラインから電子メールを送信する知...

MySQL 起動エラーを解決する: エラー 2003 (HY000): 'localhost' の MySQL サーバーに接続できません (10061)

このエラーは初心者によく発生します。この記事では主に、エラー 2003 (HY000): '...

Dockerは元のタグのイメージの再タグ付けと削除を実装します

docker イメージ ID は一意であり、イメージを物理的に識別できます。repository: ...

MySQL シリーズ 11 ログ

チュートリアルシリーズMySQL シリーズ: MySQL リレーショナル データベースの基本概念My...

Nginx の書き換え正規マッチング書き換え方法の例

Nginx の書き換え機能は、リダイレクトと同様に、URL アドレスを一時的または永続的に新しい場所...

MySQL の一般的な SQL ステートメントの概要

1. mysqlエクスポートファイル: SELECT `pe2e_user_to_company`....

ウェブサイトでページコンテンツや情報を直接コピーできない問題を解決する方法

最近では、多くのウェブサイトでは、ページ上の特定のコンテンツや情報を直接コピーすることは許可されてお...

MySQLでトリガーを作成する方法

この記事の例では、参考のためにMySQLトリガーを作成するための具体的なコードを共有しています。具体...

JavaScript キャンバス テトリス ゲーム

テトリスは非常に古典的な小さなゲームで、私もそれを書いてみました。しかし、できるだけ簡潔で論理的なコ...