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

推薦する

MySQL における冗長インデックスと重複インデックスの違い

MySQL では、1 つの列に複数のインデックスを作成できます。意図的であるかどうかにかかわらず、M...

大規模なウェブサイトアーキテクチャを設計・構築する際に考慮すべき10の課題

ここでは、PHP、JSP、または .NET 環境については説明しません。アーキテクチャの観点から問題...

Nofollowはコメントやメッセージ内のリンクを本当に機能させる

コメントとメッセージはもともと、ウェブマスターがコミュニティと読者層を構築するための優れた手段でした...

Vue-CLI3.xはプロジェクトをサーバーに自動的にデプロイします

目次序文1. scp2をインストールする2. テスト/本番環境サーバーのSSHリモートログインアカウ...

Windows での MySQL 5.7.18 インストール チュートリアル

この記事では、圧縮パッケージから MySQL をインストールする方法について説明します。 1. My...

Vueのwatch、computed、methodsの違いのまとめ

目次1 はじめに2 基本的な使い方2.1 方法2.2 計算プロパティ2.3 リスナーを見る3 3つの...

テキストの展開と折りたたみの効果を実現するJavaScript

リスト形式のテキストの展開と折りたたみの実装は参考までに。具体的な内容は以下のとおりです。必要: 1...

MySQL数千万の大規模データに対する30のSQLクエリ最適化テクニックの詳細な説明

1. クエリを最適化するには、テーブル全体のスキャンを避けてください。まず、where と orde...

CSSブレンドモードとSVGを使用して、製品画像の色を動的に変更します。

数日前、Codepen で @Kyle Wetton が書いた、CSS ブレンディング モードと S...

node.jsのコアモジュールとは

目次グローバルオブジェクトグローバルオブジェクトとグローバル変数プロセスコンソール一般的なツールユー...

Docker で php-nginx-alpine イメージをゼロから構築する方法

これまでにも Docker 環境でいくつかのプロジェクトを実行したことはありますが、まだイメージをよ...

HTML チュートリアル: よく使われる HTML タグのコレクション (5)

導入された HTML タグは、必ずしも XHTML 仕様に完全に準拠しているわけではありません。実際...

img タグの src 属性値が空の場合の 2 つのリクエストの問題 (IE 以外のブラウザ)

img src 値が空の場合、リクエストが 2 つ行われます。一部の学生は以前に同様の状況に遭遇した...

jQueryは検証コード送信のコントロールボタンを無効にする機能を実装します

必要な効果: 確認コードを送信するためにクリックした後、ボタンは無効になり、5 秒後に無効解除されま...