MySQLのトランザクション分離レベル(コミットされていない読んで、コミット、反復可能読み取りを読んで、直列化可能)

分離レベル:トランザクションが他のトランザクションからのリソースまたはデータを変更しなければならない分離の程度と

様々な異なるデータベース・トランザクションの分離レベルは、ロックの分離レベルを使用してあり、異なるアプリケーションの異なるロックが最終的に分離レベルのトランザクションにつながるれる
分離レベルの方法を達成することにあるロック

A、READ UNCOMMITTED]は、[コミットを読みます

コミットされていない手段を読む:トランザクションが別のトランザクションコミットしていないデータを読み取ることができます
につながるダーティリードのメモリではなく、実際のディスク上のデータベース内のデータに読み出されたデータを

例:

  • 1、Aがトランザクションを開始するコマンド・ライン・ウィンドウを開き、テーブル内のクエリのレコードが
    コミットされていない読み取りにトランザクション分離レベルの現在のウィンドウを設定します

コマンド:

set session transaction isolation level read uncommitted
  • 2、追加のBも開いているウィンドウを開き、トランザクションを実行しますが、SQL文をコミットしません
  • 3、ウィンドウクエリウィンドウがBから提出されたデータは表示されません再実行し

二、読むコミット[読み取りコミット]

そして、ちょうどUNCOMMITTED分離レベルの反対を読むだけで提出されたその他の事項にデータを提出しなかったデータを読み取ることができますがから出てきていない読み込まれ
ますが、問題が発生します:結果の読み取りは同じではありません前と後に起こる非反復可能読み取り
ではありません反復可能読み取りは、それが混合結果につながる読み込み複数を実行することができません

例:

  • 1、Aがトランザクションを開始するコマンド・ライン・ウィンドウを開き、テーブル内のクエリのレコードが
    コミットされていない読み取りにトランザクション分離レベルの現在のウィンドウを設定します

コマンド:

set session transaction isolation level read committed
  • 2、追加のBも開いているウィンドウを開き、トランザクションを実行しますが、SQL文をコミットしません
  • それが提出されていないため3、ウィンドウBだけでSQL文を実行見るために、クエリの結果ウィンドウを再実行
  • 4、実行ウィンドウBが提出
  • 結果ウィンドウBが表示されます。この時点でのウィンドウと見に実行するための5は、変更されています
  • 6、それは、問題が発生します:データ結果の第一および第二のビューのデータビューのウィンドウは同じではありません

三、反復可能読み取り反復可能読み取り[]

デフォルトの分離レベルのMySQL
で独自のセッションを作ることができるトランザクション分離レベルのを繰り返し、データを読み取り、結果は同じような状況が発生していないではない
別のトランザクションもまだ前のデータを表示している提出した場合でも、

例:

  • 1、Aがトランザクションを開始するコマンド・ライン・ウィンドウを開き、テーブル内のクエリのレコードは、
    トランザクション分離レベルの現在のウィンドウが反復読み出される設定

コマンド:

set session transaction isolation level repeatable read
  • 2、その後、Bがトランザクション上にある別のウィンドウを開き、SQL文を実行しますがコミットしません
  • 3、ウィンドウの再実行クエリウィンドウBは、それが提出されていないため、結果は単にSQLステートメントを実行表示されます
  • 4、実行ウィンドウBが提出
  • クエリの結果と結果は変わりません以前の結果と一致するだろうことを、実行チェック5. Aウインドウ

四、シリアライズ[シリアライゼーション]

トランザクションレベルが最も高く、以前のいくつか持っている強いよりも、トランザクション・レベル
いくつかの問題の前[ダーティは非反復可能読み取りマジック読書を読む] 解決することができます

例:

  • 図1に示すように、コマンドラインウィンドウ開口部A及びルックアップテーブルは、トランザクションレコードから始まり
    、現在のウィンドウのトランザクション分離レベルシリアライズのセットを

コマンド:

set session transaction isolation level read serializable
  • 2.開いているトランザクションもありと、SQL文を実行し、ウィンドウBを開きますが、コミットしません
  • 3. Aのこの時点でウィンドウを再実行したクエリがスタックになりますし、ノーショー
  • 4、実行ウィンドウBが提出
  • 5は、その後、実行結果の表示はウィンドウAに表示されます

直列化は、これらすべての問題を防ぐことができますが、彼らは、この分離レベルはいくつかの問題になります使用している
他の同時トランザクションが総務を待つ必要があるため、現在動作しているテーブルは、その後、それ以外だけを待っているダウン提出することができ、このようなパフォーマンス上の問題を引き起こしとして


公開された174元の記事 ウォンの賞賛5 ビュー24万+

おすすめ

転載: blog.csdn.net/Piconjo/article/details/104913975