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属性について詳しく説明します

推薦する

Linuxはiftopを使用してネットワークカードのトラフィックをリアルタイムで監視します

Linux は iftop を使用してネットワーク カードのトラフィックをリアルタイムで監視します。...

Linuxシステムにおけるキー認証に基づくSSHサービスのプロセス

ご存知のとおり、SSH は現在、リモート ログイン セッションやその他のネットワーク サービスにセキ...

Vscode が Ubuntu にリモート接続する際のエラー問題の解決方法

1. 事件の背景:仕事上、Ubuntu への vscode リモート接続を使用する必要があります。 ...

MySQL がタイムスタンプを使用するときにタイムゾーンの問題を無視できるのはなぜですか?

私はいつも、なぜMySQLデータベースのtimestampタイムゾーンの問題を無視できるのか疑問に思...

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

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

Linux システムの .bash_profile ファイルの詳細な説明

目次1. 環境変数$PATH: 2. 環境変数を変更します。 3. bash_profileの目的要...

ボタンのタイプが送信として指定されていません。ボタンをクリックしても、指定された URL にジャンプしません。

現在、プロジェクトの要件により、フォームの送信を制御し、送信前にデータを検証および処理するために j...

W3C チュートリアル (5): W3C XML アクティビティ

XML は、データを記述、保存、送信、交換するために設計されています。 XML 1.0 は XML ...

yum を使用して rpm と関連する依存関係をダウンロードして、docker をオフラインでインストールします。

yum を使用してすべての依存関係を一緒にインストールできますが、–downloadonly –d...

フィルターを使用して画像に透明な CSS を書く方法

フィルターを使用して画像に透明な CSS を書く方法コードをコピーコードは次のとおりです。 html...

MySQLスローログに関する知識のまとめ

目次1. スローログの紹介2. スローログの練習1. スローログの紹介スロー ログの正式名称はスロー...

Spring Boot + jar パッケージングのデプロイメント Tomcat 404 エラーの問題を解決する

1. Spring Boot は jsp jar パッケージをサポートしていません。jsp は wa...

Alibaba Cloud Docker Yum ソースを使用した Docker 17.03.2 の CentOS7 オンラインインストールの詳細説明

参照ドキュメント公式 Docker インストール ドキュメント: https://docs.dock...

CSS でのフレックスレイアウトの詳細な説明

フレックス レイアウトは、エラスティック レイアウトとも呼ばれます。任意のコンテナーをフレックス レ...

CSS3 クリアフロートメソッドの例

1. 目的この記事を通じて、誰もがフロートをクリアする原理と方法を理解し、最終的にこの記事が最良であ...