ホームページ  >  記事  >  データベース  >  MySQL が RC トランザクション分離を実装する方法

MySQL が RC トランザクション分離を実装する方法

PHPz
PHPz転載
2023-05-28 15:04:491670ブラウズ

ReadView メカニズムは、UNDO ログのバージョン チェーンに基づいた読み取りビュー メカニズムです。トランザクションによって更新されると、各トランザクションは ReadView を生成します

  • それ自体のデータ。

  • または ReadView を生成する前に送信されたトランザクションによって変更された値を読み取ることも、

  • を読み取ることもできます。

    ただし、ReadView を生成すると、すでにアクティブなトランザクションが存在しますが、ReadView の生成後にデータを変更して送信すると、現時点では読み取ることができません

  • またはReadView を生成し、データを変更して送信するトランザクションを開いた場合、

を読み取ることができないため、上記のメカニズムは ReadView# になります。 ##ReadView に基づいて RC を実装するにはどうすればよいですか?コア設計: トランザクションが RC を設定すると、クエリを開始するたびに ReadView が再生成されます。

データベースにデータ行があり、これはトランザクション ID=50 のトランザクションです。かなり前に挿入されました。現在アクティブなトランザクションは次のとおりです:

  • トランザクション A (id=60)

  • トランザクション B (id=70)

今すぐトランザクション B は、このデータ b を更新するために更新を開始します。このとき、データの trx_id はトランザクション B の id=70 になり、同時に undo ログが生成されます。

MySQL が RC トランザクション分離を実装する方法

この時点で、トランザクション A が開始されます。クエリ操作により ReadView が生成されます。

MySQL が RC トランザクション分離を実装する方法##この時点で、トランザクション 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 のみであるため、次のようになります:

  • min_trx_id

    は 60

  • mac_trx_id

    は 71

  • #m_ids=60

    、トランザクション B の id=70 は、m_idsアクティブなトランザクション リスト

  • には表示されません。この時点で、トランザクション A はこの ReadView に基づいて再度クエリを実行し、このデータの trx_id = 70 は、ReadView の min_trx_id と max_trx_id の範囲の間にありますが、現時点では m_ids リストに含まれていないため、この ReadView を生成する前にトランザクション B が送信されていることを示します。クエリ操作を実行すると、トランザクション B によって行われた更新操作を確認できます。これにより、トランザクション A は値 B を取得します。

以上がMySQL が RC トランザクション分離を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。