分離トランザクションが明確に動作して問題を理解する必要性によって複雑になる.MySQL分離の4つのレベルがありますが、4分離レベルは以下のとおりです。
タイプの分離レベル | 結果に影響を与えます |
UNCOMMITTED(非コミット読み取り)を読みます。 | サービスは、ダーティリード引き起こす可能性がコミットされていないデータを読み込みます、反復可能読み取りとファントムは現象を読んで、実際にはあまり使用、低分離レベルです |
READ COMMITTED(コミット読み取り) | トランザクション分離レベル1がコミットまたはロールバックされていないときの種は、トランザクション2は、ダーティリードを避けることができますが、トランザクションをコミットまたはロールバックした後、トランザクション2がケース反復可能読み取りとファントム読み取りに登場しました |
REPEATABLE READ(反復可能読み取り) | 反復可能読み取り分離レベルは、MySQLが効果的に読み込み、再読み込み状況を、しかし、ファントム読み取りを防ぐことができない汚れを避けることができ、デフォルトで |
SERIABLIZABLE(シリアライズ) | 同時に読み込み、汚れを解決することができ、反復可能読み取りとファントムは、状況を読みますが、状況がブロックされるので、その実際の使用も少ないです |
図から分かるように、異なる分離レベルは、複数のトランザクションの異なる実行結果を有します。MySQLのInnoDBストレージエンジンのデフォルトの分離レベルが反復可能読み取り(REPEATABLE READ)です。
本明細書で使用する場合、我々は、表にリストされている4つの分離レベル(ベースMySQL5.7)を実証する。使用される表は、テストされ、フィールドテストID、名前です。
MySQLの>テストから選択*; + ------ + ------- + | ID | 名前| + ------ + ------- + | 100 | zhangsan | | 200 | リージ| + ------ + ------- +
MySQLのデフォルトの暗黙的なトランザクションで有効になっているので、2がセッション・ウィンドウを開始し、このような操作を必要とする二つのウィンドウのセッションを開始しながら、操作には影響しません行うために、トランザクションは、明示的に有効にする必要がありそう。最初のウィンドウで実行します:
MySQLの>設定自動コミット= 0。
1、READ UNCOMMITTED
クエリ結果は以下から見ることができ、デフォルトの分離レベルでのMySQLはREPEATABLE READです。
MySQLの> @@ tx_isolationを選択します。 + ----------------- + | @@ tx_isolation | + ----------------- + | REPEATABLE-READ | + ----------------- +
したがって、それはUNCOMMITED読むためにデフォルトの分離レベルである必要があります:
MySQLの> SET SESSIONトランザクション分離レベルREAD UNCOMMITTED。 影響を受けたクエリOK、0行(0.00秒)
(1)最初のウィンドウで実行します。
MySQLの> UPDATEテスト・セット名= 'wangwu' ID = 100。 クエリOK、影響を受けた1行(0.00秒) 行が一致した:1変更:1つの警告:0
(2)第2の照会テーブル試験ウィンドウで:
MySQLの>テストSELECT * FROM。 + ------ + -------- + | ID | 名前| + ------ + -------- + | 100 | wangwu | | 200 | リージ| + ------ + -------- + 集合における2行(0.00秒)
上記の出力からわかるように、ID = 100名に対応するwangwuあります。
(3)その後、分離レベルを読み取る。何ら再読み取り及び試験はありませんがREAD UNCOMMITTED不可避ダーティを示し、zhangsanの名前に対応するID = 100、第2のクエリウィンドウに再び最初のウィンドウのロールバック動作を行いますファントムの場合は、ダーティリードを避けるいない場合ので、その後、状況は読み取りが発生した反復可能読み取りとファントムになり、お読みください。
MySQLの>テストから選択*; + ------ + ---------- + | ID | 名前| + ------ + ---------- + | 100 | zhangsan | | 200 | リージ| + ------ + ---------- + 集合における2行(0.00秒)
2、READ COMMITTEDは
第一及び第二の窓の分離レベルは次のように設定されています。
MySQLの> SET SESSIONトランザクション分離レベルをREAD COMMITTEDが、 影響を受けたクエリOK、0行(0.00秒)
最初のウィンドウ内のトランザクションを再オープンします。
MySQLの>設定自動コミット= 0。 影響を受けたクエリOK、0行(0.00秒)
最初のウィンドウは、その後、(現時点では操作をコミットまたはロールバック)を行います。
MySQLの>更新テスト・セット名= 'wangwu' ID = 100。 クエリOK、影響を受けた1行(0.00秒) 行が一致した:1変更:1つの警告:0
クエリのテストにおける第二のウィンドウで:
MySQLの>テストから選択*; + ------ + ---------- + | ID | 名前| + ------ + ---------- + | 100 | zhangsan | | 200 | リージ| + ------ + ---------- + 集合における2行(0.00秒)
我々にはダーティ・リード発生がないREAD COMMITTED分離レベルを使用して、上記出力により求めました。ウィンドウにコミットする場合でも、クエリウィンドウIIから得られた結果が変更されました:
MySQLの>テストから選択*; + ------ + -------- + | ID | 名前| + ------ + -------- + | 100 | wangwu | | 200 | リージ| + ------ + -------- + 集合における2行(0.00秒)
したがって、前と後の両方のケースでそれを見ていると同じではない、ので、READは反復可能読み取りを犯し避けるために説明されていない得コミット。
3、REPEATABLE READ
データの開始前に:
MySQLの>テストから選択*; + ------ + ---------- + | ID | 名前| + ------ + ---------- + | 100 | zhangsan | | 200 | リージ| + ------ + ---------- + 集合における2行(0.00秒)
同様に、第一及び第二の窓の分離レベルは次のように設定されています。
MySQLの> SET SESSIONトランザクション分離レベルREPEATABLE READ。 影響を受けたクエリOK、0行(0.00秒)
実行の最初のウィンドウ:
MySQLの> SET AUTOCOMMIT = 0; 影響を受けたクエリOK、0行(0.00秒)
ウィンドウ更新名の最初のテストで:
MySQLの> UPDATEテストセット名= '暁' ID = 100。 クエリOK、影響を受けた1行(0.00秒) 行が一致した:1変更:1つの警告:0
第二の窓クエリ試験では:
MySQLの>テストから選択*; + ------ + ---------- + | ID | 名前| + ------ + ---------- + | 100 | zhangsan | | 200 | リージ| + ------ + ---------- + 集合における2行(0.00秒)
この発見で、第2のウィンドウ内のデータのクエリが変更されていない、REPEATABLE READダーティリードを避けます。
最初の提出ウィンドウ更新クエリが実行されたとき一方、データは、反復可能読み取り説明した場合を避けるためにも、第二のウィンドウで変更されません。
MySQLの>テストから選択*; + ------ + ---------- + | ID | 名前| + ------ + ---------- + | 100 | zhangsan | | 200 | リージ| + ------ + ---------- + 集合における2行(0.00秒)
第二のウィンドウでは、関係なく読んで何回、データが第2のウィンドウも更新される第二のウィンドウのこの時点で、提出した場合にのみ、最初のウィンドウのデータに更新されません読みませんデータ。
MySQLの>テストから選択*; + ------ + ---------- + | ID | 名前| + ------ + ---------- + | 100 | 暁明| | 200 | リージ| + ------ + ---------- + 集合における2行(0.00秒)
最後に、データは、第2のウィンドウ内に挿入されています。
MySQLの>試験値(300、 'wangwu')に挿入します。 クエリOK、影響を受けた1行(0.00秒)
第一の窓更新データに論理的には、影響を受けたデータの2つの列が存在すべきであるが、影響を受けたデータの3行を有することが見出され、この時間は、ファントムの現象の出現を示す読み取ります。
MySQLの>更新テストセット名= 'zhaoliu'; クエリOK、影響を受けた3行(6.36秒) 行が一致した:3は、変更:3つの警告:0
4、SERIALIZABLE
第一及び第二の窓の分離レベルは次のように設定されています。
MySQLの> SET SESSIONトランザクション分離レベルSERIALIZABLE; 影響を受けたクエリOK、0行(0.00秒)
業務データの開始前に:
+ ------ + --------- + | ID | 名前| + ------ + --------- + | 100 | zhaoliu | | 200 | zhaoliu | | 300 | zhaoliu | + ------ + --------- + 組の3行(0.00秒)
ウィンドウ2の挿入操作は、現象の遮断が発生した場合、ウィンドウはウィンドウ1は、コミット操作を実行する場合にのみ、1(すなわち、ロックを解除していない)、および、データがウィンドウ2つのより多くの成功に挿入されて提出していなかったので。
本論文では、実験の方法により、4つの分離レベルでのMySQLの検証。効果的にこれら四つの分離レベルの理解を深めことができます。
間違っている場合は、私を修正してください。ありがとう