MySQLのトランザクション・アイソレーションの一貫性の読み取りの概要

2253 ワード

前言
以前はMySQLのトランザクション独立性レベルを簡単に理解していましたが、MySQLで最もよく使われるトランザクション独立性レベルには、繰り返し読み取り(RR)と読み取りコミット(RC)があることがわかりました.ここで、RRレベルでは、トランザクションの開始時にトランザクションがコミットされた後のデータの読み取りが一貫しています.この記事では、一貫性のある読み取りがどのように実現されたのか、場合によっては一貫性のない問題について詳しく説明します.
スナップショット(コンシステンシビュー)
RR独立性レベルでは、トランザクションが開始されると、現在のトランザクション操作のためにライブラリ全体のデータスナップショット(コンシステンシビュー)が作成され、各トランザクションに独自のスナップショット(コンシステンシビュー)があります.これにより、データの独立性が保証され、トランザクション間の操作が相互に影響しません.スナップショット(コンシステンシビュー)は、ライブラリ全体のデータcopyではなく、トランザクションid(transaction_id)とローレコードid(row trx_id)に基づいて実現されることに注意してください.InnoDBでは、新しいトランザクションごとに一意のインクリメントトランザクションidがあり、各ローに複数の変更レコードidがあり、現在のトランザクションがローに対して操作するとtransaction_id現在の行に割り当てられたtrx_id、かつ旧バージョンのtrx_idは、トランザクションがローデータをクエリーするときに使用するために保存する必要があります.
複数バージョン
InnoDBでは,マルチバージョンがロールバックログによって実現されることを保証し,ロールバックログ(undolog)は上図のU 1,U 2,U 3である.上図の最新動作の結果はV 4であり、V 1の値を得るには、V 4の値とundologから一歩一歩前に計算して得られる.すなわち,V 1,V 2,V 3のデータは物理的に存在するものではなく,ログに基づいて前に出される.
現在の読み取り
RRでは、データ分離メカニズムは:1、コミットされていない非表示;2、現在のトランザクションスナップショットが作成される前、コミットされた可視3、現在のトランザクションスナップショットが作成された後、コミットされた非可視仮定上の図のkの初期値は1である.以上の内容により、図中のA、Bはそれぞれどんな内容になりますか?(トランザクションCの更新が完了するとトランザクションがコミットされるので、トランザクションBはブロックされません)トランザクションAはスナップショットを作成し、トランザクションBはその後スナップショットを作成し、トランザクションCを実行します.A:Aに対して取得したデータはB,Cの影響を受けず,1がB:Bに対してupdateを実行する場合,コミットされたトランザクションがそのローに対する更新操作に影響を及ぼさないように先に読み直し,この読み方は現在の読み方であり,最新のデータが読み出される.(row trx_idによる)を更新し、現在のローの最新バージョンを更新した後、Bはselectに行き、CとBの両方が更新された最終データ3を読みました.
データを更新するときは、すべて先に読んでから書きますが、この読みは現在の読みで、現在最新のコミットされたトランザクションの値だけを読み取ります.updateだけでなく、select ... lock in share mode select ... for updateでも現在読むことができます.
読み取りと読み取りの繰り返し可能なコミット
繰り返し読むことができる核心は一致性読みである.トランザクションの更新には、現在の読み取りが使用されます.ただし、ロー・データがコミットされていないトランザクションupdateにロー・ロックが追加されると、他のトランザクションはトランザクションのコミット・ロックの解放を待つしか動作しません.反復可能読み出しでは、トランザクションの開始時にデータ・スナップショット(コンシステンシ・ビュー)が確立され、トランザクションの他の操作はスナップショット(コンシステンシ・ビュー)を共有します.読み込みコミット・アイソレーションでは、データ・スナップショット(コンシステンシ・ビュー)は各文が実行される前に再計算されるため、トランザクションが開始され、selectの前に他のトランザクションがデータ更新をコミットすると、selectはコミットされた最新データをクエリーできます.
まとめ
InnoDBでは、各行のデータに独自のrow trx_があります.idバージョンでは、各トランザクションまたは文に独自のデータスナップショット(コンシステンシビュー)があり、通常のクエリーでは、バージョンidに基づいてデータスナップショットに表示されるデータを取得します.したがって、繰り返し読み取り可能な場合、クエリはトランザクションが開始される前に完了したデータのみをコミットします.読み込みコミットの場合、クエリは文の実行前に完了したデータのみをコミットします.