MySQL分離の使用手順を読む

MySQL分離の使用手順を読む

現在のトランザクションはどの履歴バージョンを読み取ることができますか?

読み取りビューは、トランザクションが開かれたときのすべての現在のトランザクションのコレクションです。このデータ構造には、現在の読み取りビューの最大 ID と最小 ID が格納されます。

以下に示すように、現在アクティブなトランザクションのリストは次のとおりです。

ct-trx --> trx11 --> trx9 --> trx6 --> trx5 --> trx3;

ct-trx は現在のトランザクションの ID を表し、対応する read_view データ構造は次のとおりです。

read_view->creator_trx_id = ct-trx;
read_view->up_limit_id = trx3; 低水位 read_view->low_limit_id = trx11; 高水位 read_view->trx_ids = [trx11, trx9, trx6, trx5, trx3];

low_limit_id は「最高水準点」、つまりその時点でアクティブなトランザクションの最大 ID です。db_trx_id>=low_limit_id の行を読み取ると、これらの ID より前のデータがコミットされていないことを意味します。コメントに記載されているように、これらのデータは表示されません。

trx_id >= view->low_limit_id の場合 {
戻り値(FALSE);
}

注: ソースコードの一部を読む

up_limit_id は「最低水準点」、つまり、その時点でアクティブなトランザクション リスト内の最小のトランザクション ID です。行の db_trx_id が up_limit_id より小さい場合、トランザクションが ID を作成したときにこれらのデータがコミットされたことを意味します。コメントで説明されているように、これらのデータは表示されます。

if (trx_id < view->up_limit_id) {
戻り値(TRUE);
}

行の db_trx_id が low_limit_id と up_limit_id の間にある場合は、レコードの db_trx_id が自身のトランザクションの read_view->trx_ids リスト内にあるかどうかを確認します。リスト内にある場合、レコードの現在のバージョンは表示されません。リスト内にある場合、レコードの現在のバージョンは表示されます。

異なる分離レベルでの ReadView 実装方法

1. 読み取りコミット:

つまり、各ステートメントの実行中に、read_view は閉じられ、row_search_for_mysql 関数で新しい read_view が作成されます。これにより、繰り返し不可能な読み取り現象が発生します。

2. 繰り返し読み取り:

繰り返し読み取り分離レベルでは、トランザクション trx 構造が作成されると、現在のグローバル読み取りビューが生成されます。 trx_assign_read_view 関数を使用して作成され、トランザクションの終了まで維持されます。トランザクションが終了する期間中は、クエリごとに読み取りビューが再構築されないため、繰り返し読み取りが実現されます。

補足: MySQL の mvcc と readview

分離レベルの標準定義:

コミットされていない読み取りトランザクションは、別のトランザクションのコミットされていない結果(ロールバックされる可能性がある)を読み取ります。これはダーティ リードと呼ばれ、ダーティ リード、ファントム リード、および非反復読み取りの問題を引き起こす可能性があります。

読み取りコミット トランザクション a は、別のトランザクション b の最新のコミットされた結果を読み取ります。これにより、トランザクション a の読み取り結果が 2 回異なるものになります。これにより、ダーティ リード、反復不可能な読み取り、およびファントム リードが回避されます。これは、バージョン チェーン (mvcc) と readview によって実現されます。

繰り返し読み取り (MySQL のデフォルトの分離レベル) トランザクションが初めてレコードを読み取り、別のトランザクションがそのレコードを変更してコミットした後も、トランザクション A は最初の値を読み取ります。これが繰り返し読み取りです。同じトランザクションで同じデータを複数回読み取ることによって返される結果は同じです。トランザクションは、他のトランザクションがコミットされている場合でも、他のトランザクションによって既存のデータに加えられた変更を読み取りません。つまり、トランザクションの開始時に読み取られた既存データの値は、トランザクションがコミットされる前のどの時点でも同じです。ただし、他のトランザクションの新しく挿入されたデータは読み取られる可能性があり、これもファントム読み取りの問題を引き起こします。ダーティ リードや反復不可能な読み取りの問題は回避されますが、ファントム リードは依然として存在します。バージョンチェーンとreadviewにより、ファントム読み取りは依然として発生します(ただし、MySQLはファントム読み取りの問題を解決します)。

Serializable では、同じレコード行の同時読み取りと書き込みは許可されません。ファントム読み取りやダーティ読み取りが発生しないように、シリアルで実行する必要があります。

MySQLでは、コミット読み取りと繰り返し読み取りのトランザクション分離レベルは、mvccとreadviewを通じて実装されます。

MVCC は Multi-Version Concurrency Control (マルチバージョン同時実行制御) の略で、データの複数のバージョンを維持して、トランザクション間の読み取りと書き込みが競合することなく分離レベルに応じて対応する結果を取得できるようにします。

分離レベル読み取りコミットの場合、毎回新しい読み取りビューが生成されます。

分離レベル繰り返し読み取りの場合、読み取りビューはトランザクションが開始されたときにのみ生成され、トランザクションがコミットされるまで変更されないため、繰り返し読み取りが保証されます。

読み取りビューを生成するとき

m_ids: アクティブなトランザクションIDのリストを表します

min_trx_id: アクティブなトランザクションの中での最小のトランザクション ID

max_trx_id: 作成された最大トランザクションID

Creator_trx_id: 現在のトランザクションID

現在のトランザクションでは、次のルールに従って最新バージョンからトラバースし、対応するバージョン レコードを取得します。

1. アクセスされた trx_id は readview の Creator_trx_id と同じであり、現在のトランザクションが自身によって変更され、表示されて返されるレコードにアクセスしていることを示します。

2. アクセスされた trx_id が min_trx_id より小さい場合、バージョンが送信され、表示可能であることを示し、返されます。

3. アクセスされた trx_id が max_trx_id 以上の場合、readview の生成時にバージョンが有効になっていなかったため、表示されずに返されます。

4. アクセスされた trx_id が min_trx_id と max_trx_id の間にある場合、それが m_ids 内にあるかどうかを確認します。そうである場合、readview が生成されたときに、このバージョンのトランザクションがコミットされておらず、バージョンが表示されないことを意味します。そうでない場合は、readview が生成されたときに、このバージョンのトランザクションがコミットされ、表示されることを意味し、結果が返されます。

上記は私の個人的な経験です。参考になれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。間違いや不備な点がありましたら、遠慮なくご指摘ください。

以下もご興味があるかもしれません:
  • 例を通してMySQLでプレフィックスインデックスを使用する方法を学ぶ
  • MySQL プレフィックス インデックスによって発生する遅いクエリ分析の概要
  • MySQLにおけるトランザクション分離レベルの実装原理の詳細な説明
  • MySQLトランザクションの特徴と分離レベルについてお話ししましょう
  • MySql の 4 つのトランザクション分離レベルについて簡単に説明します。
  • MySQLトランザクションとSpring分離レベルの実装原理の詳細な説明
  • MySQL トランザクション分離レベルの原則例分析
  • Mysql トランザクション分離レベルの読み取りコミットの詳細な説明
  • MySQL 分離列とプレフィックスインデックスの使用の概要

<<:  Apache Tomcat と IDEA エディターの統合に関する詳細なチュートリアル

>>:  Vueのコンポーネントのprops属性について詳しく説明します

推薦する

HTML ボディタグと HTML でよく使われる制御タグの詳細な説明

1. <body> タグ: Web ページの本体をマークするために使用されます。body...

SecureCRT に基づくリモート Linux ホストへのファイルのアップロードとダウンロードのグラフィカルな手順

wget や curl ツールを使用して、Linux サーバーで大規模なネットワーク ファイルを直接...

MySQL オンラインリカバリ UNDO テーブルスペース 実戦記録

1 MySQL5.6 1.1 関連パラメータMySQL 5.6 では、innodb_undo_dir...

MySQL カウントを向上させる方法のまとめ

多くのプログラマーは MySQL に精通していると思います。多くの人が count の使い方と、最適...

Mysql データベースのマスタースレーブ同期構成

目次Mysql マスタースレーブ同期構成1. 2つのmysqlをインストールする2. MySQL設定...

ウェブデザインと制作におけるハイパーリンクの効果の向上

ハイパーリンクを使用すると、ページからページへ、またはサイトからサイトへ瞬時に移動できます。このよう...

MySQL explain クエリ命令情報の取得原理と例

explain はクエリ実行プラン情報を取得するために使用されます。 1. 文法次のように、sele...

CSS フロート(float, clear)の人気の解説と体験談

私はかなり昔に CSS に触れましたが、フローティングについてはいつも混乱していました。私の理解が浅...

Linux学習におけるmkdirコマンドの詳しい説明

目次序文1. ファイルの概念に関する基礎知識2. mkdir コマンド序文最近、Linux にますま...

ウェブページの背景画像を伸ばす2つの方法

解決策は2つあります。 1つはCSSで、background-size:coverを使用して画像の伸...

図を使ってWeb2.0とは何かを説明する

最近はWeb2.0という言葉をよく耳にしますが、Web2.0とは何でしょうか? Web 1.0 とど...

Xshell を使用して VMware 上の Linux 仮想マシンに接続する (グラフィック手順)

はじめに: 最近 Hadoop プラットフォームの構築を勉強し始めたので、ローカルマシンに VMwa...

VMware のインストールと使用時の問題と解決策

仮想マシンは使用中であるか、接続できません次のようなエラーが報告された場合解決まずこのページにアクセ...

Vue を使用して CSS トランジションとアニメーションを実装する方法

目次1. トランジションとアニメーションの違い2. Vueを使用して基本的なCSSトランジションとア...

ウェブページのメモリ使用量とCPU使用量を削減する方法

一部の Web ページは大きく見えなくても開くのに非常に時間がかかる場合があります。一方、他の We...