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 アニメーションおよびその他の効果のサンプル コード

推薦する

Linux環境でタイムゾーンを設定できない問題を解決

Linuxでタイムゾーンを変更する場合、常に変更することはできませんAsia/Shanghai に変...

JS でカルーセル効果を実現する 3 つの簡単な方法

この記事では、JSカルーセル効果の具体的なコードを実現するための3つの方法を紹介します。具体的な内容...

Vue ショッピングカートのケーススタディ

目次1. ショッピングカートの例2. コードの実装3. まとめ1. ショッピングカートの例一連の学習...

docker-maven-plugin の詳細な使用方法

目次Docker-Maven-プラグインMavenプラグインの自動デプロイメント手順1. ホストマシ...

MySQL InnoDB MRR 最適化ガイド

序文MRR は Multi-Range Read の略で、ランダム ディスク アクセスを削減し、ラン...

バランスの取れたデジタルスクロール効果を実現するJavaScript

目次1. 実施の背景2. 実装のアイデア3. 実施プロセス1. 実施の背景先週、ユーザーがタスクを完...

Docker を使用して ELK 環境を迅速にデプロイする方法の詳細な説明 (最新バージョン 5.5.1)

Linux サーバーに Docker をインストールした後、関連する公式 Docker イメージを...

mysql 一時テーブルの使用状況の分析 [クエリ結果は一時テーブルに保存できます]

この記事では、例を使用して MySQL 一時テーブルの使用方法を説明します。ご参考までに、詳細は以下...

バッチモードでtopコマンドを実行する方法

top コマンドは、Linux システムのパフォーマンスを監視するために誰もが使用している最適なコマ...

IIS 7.5はURL書き換えモジュールを使用してWebページのリダイレクトを実現します。

Apache では構成ファイルで Web ページまたは Web サイトの書き換えを簡単に設定できる...

Alibaba Cloud サーバーの購入とインストール方法

1. サーバーを購入するこの例では、購入したサーバーはAlibaba Cloudです。大学生はAli...

Rails APIを使用してReactアプリケーションを構築するための詳細な手順

目次バックエンド: Rails API部分フロントエンド: React部分Reactコンポーネントa...

DockerはClickHouseをインストールし、データテストを初期化します

クリックハウスの紹介ClickHouse は、SQL クエリを使用して分析データ レポートをリアルタ...

不規則な絵の滝の流れ原理の分析と応用

プロジェクトで発生した不規則な絵画壁のレイアウト問題は、次のように分析されます。 1.img dis...

MySQL 独立インデックスと共同インデックスの選択

複数列のインデックスについては、理解が不足していることがよくあります。よくある間違いは、多数の列に独...