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 で破線境界線を実装する例

推薦する

WMLタグの概要

構造関連タグ--------------------------------------------...

CSS でインラインブロック要素間のギャップを削除するいくつかの方法の詳細な説明

最近、モバイルページを制作する際には、レイアウトにインラインブロック要素がよく使われますが、インライ...

MySQLのROUND関数の丸め演算における落とし穴の分析

この記事では、MySQL の ROUND 関数を使用した丸め操作の落とし穴を例を使って説明します。ご...

MySQL無料インストールバージョンの設定チュートリアル

この記事では、参考までにMySQLの無料インストール構成チュートリアルを紹介します。具体的な内容は次...

MySQL 8.0.15 インストール グラフィック チュートリアルとデータベースの基礎

MySQLソフトウェアのインストールとデータベースの基礎は参考用です。具体的な内容は次のとおりです。...

MySQL 5.7.20 解凍版のインストールとルートパスワードの変更に関するチュートリアル

1. MySQL アーカイブ (解凍版) をダウンロードするURL: https://downloa...

デジタル時計効果を実現するJavaScript

この記事の例では、JavaScriptでデジタル時計効果を実装するための具体的なコードを参考までに共...

MySQL 8.0.23 のインストールと設定方法のグラフィックチュートリアル (Win10 の場合)

この記事では、MySQL 8.0.23のインストールと設定方法を参考までに紹介します。具体的な内容は...

ElementUI コンポーネント el-dropdown (落とし穴)

選択して変更: クリックすると現在の値が表示され、ページ UI が表示され、CSS スタイルが変更さ...

docker を使用して Linux 環境に Springboot パッケージをデプロイするチュートリアル

springboot には tomcat サーバーが組み込まれているため、jar パッケージにパッケ...

docker を使用して Django テクノロジー スタック プロジェクトをデプロイする方法

Docker の人気と成熟に伴い、Docker は徐々にプロジェクトをデプロイするための第一の選択肢...

MySQLオンラインデータベースのデータをクリーンアップする方法

目次01 シナリオ分析02 操作方法03 結果分析01 シナリオ分析今日の午後、開発仲間がオンライン...

Vue Element Sortablejs を使用してテーブル列をドラッグする詳細な説明

1. css: ドラッグテーブル.css @charset "UTF-8"; ....

MySQLデータベースとテーブルシャーディングの概要

プロジェクトの開発中に、データベースのデータがどんどん大きくなり、その結果、1 つのテーブルにデータ...

Mysql の一時テーブルとパーティションテーブルの違いの詳細な説明

一時テーブルとメモリテーブルメモリ テーブルとは、メモリ エンジンを使用するテーブルを指します。テー...