ReadView メカニズムは、UNDO ログのバージョン チェーンに基づいた読み取りビュー メカニズムです。トランザクションによって更新されると、各トランザクションは ReadView を生成します
それ自体のデータ。
または ReadView
を生成する前に送信されたトランザクションによって変更された値を読み取ることも、
ただし、ReadView を生成すると、すでにアクティブなトランザクションが存在しますが、ReadView の生成後にデータを変更して送信すると、現時点では読み取ることができません
またはReadView
を生成し、データを変更して送信するトランザクションを開いた場合、
を読み取ることができないため、上記のメカニズムは ReadView# になります。 ##ReadView に基づいて RC を実装するにはどうすればよいですか?コア設計: トランザクションが RC を設定すると、クエリを開始するたびに ReadView が再生成されます。
データベースにデータ行があり、これはトランザクション ID=50 のトランザクションです。かなり前に挿入されました。現在アクティブなトランザクションは次のとおりです:
今すぐトランザクション B は、このデータ b を更新するために更新を開始します。このとき、データの trx_id はトランザクション B の id=70 になり、同時に undo ログが生成されます。
この時点で、トランザクション A が開始されます。クエリ操作により ReadView が生成されます。##この時点で、トランザクション A は、クエリを実行すると、現在のデータの trx_id=70 がわかります。つまり、これは ReadView のトランザクション ID 範囲に属しており、ReadView を生成する前にこのアクティブなトランザクションが存在したことを意味します。このデータの値を変更したのはこのトランザクションでしたが、この時点ではトランザクション B はまだ送信されていません。 ReadView の m_ids アクティブ トランザクション リスト ここでは、ID [60, 70] が 2 つありますが、このとき
ReadView メカニズムに従って、トランザクション A はトランザクション B によって変更された値 b を見つけることができません。 次に、UNDO ログのバージョン チェーンを下方向に検索すると、元の値が見つかります。その trx_id が 50 であることがわかります。これは、現在の ReadView の min_trx_id よりも小さいです。これは、トランザクションがあったことを意味します。 ReadView を生成する前に挿入されました。この値はずっと前に取得されて送信されているため、元の値を見つけることができます。
トランザクション B がコミットされたと仮定します。これは、トランザクション B がデータベース内でアクティブなトランザクションではなくなったことを意味します。次回トランザクション A がクエリを実行すると、トランザクション B の変更された値を読み取ることができます。では、トランザクション A は、送信されたトランザクション B の変更された値をどのようにして読み取ることができるのでしょうか?
トランザクション A が次回クエリを開始し、ReadView を生成できるようにします。データベース内でアクティブなトランザクションはトランザクション A のみであるため、次のようになります:
は 60
は 71
、トランザクション B の id=70 は、m_ids
アクティブなトランザクション リスト
以上がMySQL が RC トランザクション分離を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。