現在のトランザクションはどの履歴バージョンを読み取ることができますか?読み取りビューは、トランザクションが開かれたときのすべての現在のトランザクションのコレクションです。このデータ構造には、現在の読み取りビューの最大 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 を応援していただければ幸いです。間違いや不備な点がありましたら、遠慮なくご指摘ください。 以下もご興味があるかもしれません:
|
<<: Apache Tomcat と IDEA エディターの統合に関する詳細なチュートリアル
>>: Vueのコンポーネントのprops属性について詳しく説明します
この記事の例では、カルーセルのフレームレート再生を実現するためのVueの具体的なコードを参考までに共...
この記事では、スライダー検証コードを実装するためのJavaScriptの具体的なコードを参考までに共...
1. ページ要件1) 標準のヘッダーとフッターを使用するXML/HTML コードコンテンツをクリップ...
目次1. 元の値と参照値2. インスタンス3. 範囲1. 元の値と参照値6 つの単純なデータ型の値は...
padding-top パーセンテージを使用すると、固定幅と比例した高さの表示を実現できます。現在の...
以下のように表示されます。昨日: UNIX_TIMESTAMP(CAST(SYSDATE() AS ...
最近、LAN 内のすべてのホスト名を一覧表示する必要があります (SMB プロトコル)。しかし、fi...
方法1: SET PASSWORDコマンドを使用する mysql -u ルート mysql> ...
目次導入子プロセスプロセスを非同期的に作成する同期作成プロセス導入Node.js のメイン イベント...
昨日 HTML を少し学んだばかりで、JD.com の検索バーを作るのが待ちきれませんでした。 作っ...
目次設定を追加json 構成レイヤー構成の表示論理層の構成位置追跡をオンにする録音を開始開始座標を決...
Nginx の最適化 - バージョン番号と Web ページのキャッシュ時間を非表示にするバージョン番...
vue+remを使用したカスタムカルーセルチャートの実装は参考までに。具体的な内容は以下のとおりです...
レイアウトにul>liを使用した単一行レイアウトを以下に示します。 <ul class=...
この記事では、Centos7.3でのmysql5.7.18のインストールと初期パスワードの変更につい...