MySQL の簡単な分析 - MVCC

MySQL の簡単な分析 - MVCC

バージョンチェーン

InnoDB エンジン テーブルでは、クラスター化インデックス レコードに 2 つの非表示の列があります。

  • trx_id: データを変更するときにトランザクションIDを保存するために使用されます
  • roll_pointer: クラスター化インデックス レコードが変更されるたびに、古いバージョンが UNDO ログに書き込まれます。この roll_pointer には、このクラスター化インデックス レコードの以前のバージョンの場所を指すポインターが格納され、これを通じて以前のバージョンのレコード情報を取得できます。

id名前trx_idロールポインタ
1シャオミン50 0x00af

たとえば、trx_id 60 のトランザクションがあり、次のステートメントを実行しているとします: update table set name = 'Xiaoming1' where id = 1

この時点で、UNDOログにバージョンチェーンが存在する。

id名前trx_idロールポインタ
1シャオミン1 60最終バージョン
↓ポイント
1シャオミン50ヌル

バージョンチェーンはgitに似ており、データ行のバージョン管理を実行し、undo_logを通じてロールバックすることができます。

閲覧ビュー

Read Committed と Repeatable Read の違いは、ReadView を生成するための戦略が異なることです。

ReadView には主に、システム内で現在アクティブな読み取りおよび書き込みトランザクション (コミットされていない開始トランザクション) を保存するためのリストがあります。このリストは、レコードのバージョンが現在のトランザクションに表示されるかどうかを判断するために使用されます。現在のリスト内のトランザクションIDが[80,100]であると仮定します。

id <= 80 (最小トランザクション ID)
id >= 80 && id <= 100
id >= 100

これらのレコードはバージョン チェーンで検索されます。最初に最新のレコードが検索されます。最新のレコードのトランザクション ID が条件を満たさず、表示されていない場合は、以前のバージョンが検索され、現在のトランザクションの ID がこのバージョンのトランザクション ID と比較され、アクセスできるかどうかが確認されます。このプロセスは、表示可能なバージョンが返されるか、プロセスが終了するまで繰り返されます。

たとえば、Read Committed 分離レベルでは次のようになります。

たとえば、この時点でトランザクション ID 100 のトランザクションがあり、名前が Xiaoming 2 になるように名前が変更されますが、トランザクションはまだコミットされていません。現時点でのバージョンチェーンは

id名前trx_idロールポインタ
1シャオミン2 100最終バージョン
↓ポイント
1シャオミン1 60最終バージョン
↓ポイント
1シャオミン50ヌル

このとき、別のトランザクションがID 1のレコードを照会するSELECTステートメントを開始し、生成されたReadViewリストは[100]のみになります。次に、バージョン チェーンに移動して検索します。まず、最新のものを見つける必要があります。trx_id が 100 であることがわかります。これは、Xiaoming 2 という名前のレコードです。これはリスト内にあるため、アクセスできません。

このとき、ポインターを介してXiaoming 1という名前の次のレコードを探し続け、trx_idが60であることがわかりました。これはリスト内の最小IDより小さいため、アクセスできます。直接アクセスの結果はXiaoming 1です。

このとき、トランザクション ID 100 のトランザクションをコミットし、ID 110 の新しいトランザクションを作成して ID 1 のレコードを変更し、トランザクションはコミットしません。

--trx_id = 110
始める;
テーブルセット名 = 'Xiaoming3'、ID = 1 を更新します。

現時点では、バージョンチェーンは

id名前trx_idロールポインタ
1シャオミン3 110最終バージョン
↓ポイント
1シャオミン2 100最終バージョン
↓ポイント
1シャオミン1 60最終バージョン
↓ポイント
1シャオミン50ヌル

この時点で、前の選択トランザクションは、ID 1 のレコードを照会するために別のクエリを実行しました。

分離レベルが異なると結果も異なります

コミット読み取り分離レベルの場合は、この時点で新しい ReadView が作成され、アクティブ トランザクション リストの値が [110] に変更されます。

上記のステートメントによれば、バージョン チェーンに移動して trx_id を比較し、適切な結果 (Xiao Ming 2) を見つけます。

繰り返し読み取り分離レベルの場合、ReadView は最初の選択時に生成された ReadView のままです。つまり、リストの値は [100] のままです。したがって、選択の結果は Xiao Ming 1 になります。したがって、2 番目の選択の結果は最初の選択と同じなので、繰り返し読み取りと呼ばれます。

これは MySQL の MVCC であり、バージョン チェーンを通じて複数のバージョンを実装し、読み取り書き込み操作と書き込み読み取り操作を同時に実行できます。さまざまな ReadView 生成戦略を通じて、さまざまな分離レベルが実現されます。

上記は、MySQL - MVCC の詳細についての簡単な分析です。MySQL mvcc の詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • MySQL マルチバージョン同時実行制御 MVCC の詳細な研究
  • MySQL MVCCメカニズム原理の詳細な説明
  • MySQLのMVCCマルチバージョン同時実行制御の実装
  • MySQL マルチバージョン同時実行制御 MVCC の実装
  • MySQL マルチバージョン同時実行制御 MVCC の基本原理の分析

<<:  WindowsにOpenSSLをインストールし、OpenSSLを使用して公開鍵と秘密鍵を生成します。

>>:  html2canvas で破線境界線を実装する例

推薦する

Tomcat パイプライン モードのパイプラインとバルブの詳細な説明

序文比較的複雑な大規模システムでは、複雑なロジックで処理する必要があるオブジェクトまたはデータ フロ...

ウォーターフォールレイアウト+ダイナミックレンダリングの実装

目次典型的なウォーターフォールウェブサイトウォーターフォールフローレイアウトの原則一般的な考え方具体...

CSS3 で King of Glory マッチング人員読み込みページを実装する方法

King of Glory をプレイしたことがある人なら、このページの効果をよくご存知でしょう。なぜ...

MySQL 変数の原理と応用例

MySQL ドキュメントでは、MySQL 変数はシステム変数とユーザー変数の 2 つのカテゴリに分類...

Vue2.x および Vue3.x のカスタム命令の使用方法とフック関数の原理を理解する

目次Vue2.x の使用法グローバル登録部分登録使用フック機能フック関数のパラメータVue3.x の...

Jira リバース プロキシを実装するための nginx について

概要: nginx リバース プロキシ jira を構成し、https を実装します。Tomcat ...

JavaScriptのURLオブジェクトとは何かについて話しましょう

目次概要ハッシュプロパティホストプロパティホスト名属性Href属性起源のプロパティユーザー名とパスワ...

Docker コンテナを他のサーバーに移行する 5 つの方法

多くの場合、移行は避けられません。ハードウェアのアップグレード、データ センターの変更、古いオペレー...

Vueはカスタムツリーコンポーネントを再帰的に実装します

この記事では、カスタムツリーコンポーネントを再帰的に実装するVueの具体的なコードを参考までに共有し...

MySQL コール初心者が犯しがちな 11 の間違いのまとめ

序文セキュリティ部門からSQLインジェクションやXSS攻撃の脆弱性などに関する警告メールを頻繁に受け...

Windows Server 2008 R2 リモート デスクトップのポート 3389 を変更する方法

Windows サーバー リモート デスクトップのデフォルトのポート番号は 3389 です。職場でサ...

Docker を使って LEMP 環境を素早く構築する方法の例

LEMP(Linux + Nginx + MySQL + PHP)は、基本的に今日のWeb開発者にと...

ドロップダウンメニュー効果を実現するJavaScript

参考までに、JavaScriptを使用してドロップダウンメニューを実装します。具体的な内容は次のとお...

Vueドロップダウンメニューのコンポーネント開発の詳細説明

この記事の例では、Vueドロップダウンメニューのコンポーネント開発の具体的なコードを参考までに共有し...

レスポンシブウェブデザインを実現するためにIEでCSS3メディアクエリをサポートする

今日の画面解像度は、320 ピクセル (iPhone) ほど小さいものから、2560 ピクセル以上 ...