4つの特性とMySQLのトランザクション分離レベル
定義
MySQLのトランザクション分離レベルと4つのプロパティは、トランザクションがアトミックSQL文のセット、またはワークの別個のユニットです。トランザクション内のSQL文、どちらかすべて成功するか失敗する実行。
4つのトランザクション(ACID)の1特性
- 原子性(アトミック):トランザクションはトランザクション全体ですべての操作がすべて正常に送信、またはすべてのトランザクションのロールバックに失敗のいずれか、不可欠な最小単位と見なされなければならない、成功した操作の一部のみを実行することは不可能ですこれは、トランザクションの原子です。
- 一貫性(整合性):データは、常に状態から別の一貫した状態に一致する遷移です。
- 分離(隔離):複数の同時トランザクションが互いに分離されている間に他のトランザクションに、最終的な提出の前に変更を行う会社は、表示されません。トランザクションの分離は、MySQLは、分離の4つのレベルを提供します。
- 持続性(耐久性):トランザクションのコミットすると、変更が永続的にデータベースに保存されています。システムがクラッシュした場合でも、変更されたデータが失われることはありません。
汚れは、非反復可能読み取り、反復可能読み取り、シリアライズ(読み込み)を読み込みます
2.1ダーティ・リード
コミットされていないトランザクションが進行中トランザクションである別のデータを読み取るためのダーティ・リード手段。
2.2非反復リード
非反復リードは、単一のトランザクション内のデータ、複数のクエリのデータベースを指すが、トランザクションの過程で、データが変更され、別のトランザクションが提出される起因する異なるデータ値を返します。
2.3反復可能読み取り:
ダーティリード防ぐことができ、またとないが発生して読み取ります。
2.4直列化(読み取り)が
ダーティ読み出し、非反復可能読み取りを防止することができる、ファントムリードが発生します。
分離レベル
トランザクションの分離は、MySQLは、分離の4つのレベルを提供します。
- シリアライズ(直列化)は:ファントムリードが発生し、ダーティ読み出し、非反復可能読み取りを防止することができます。(最高レベル)
- 反復読み(反復可能読み取り):ダーティリード防ぐことができ、またとないが発生して読み取ります。
- (読み取りコミット)コミット-読む:汚れが発生するの読み込みを避けることができます。
- 読み取りコミットされていない(非コミット読み取り):最低のレベルは、どのような場合には保証できません。(最低レベル)
最高シリアライズ上記の4つの分離レベルは、最低レベルは、読み取りコミットされていません。もちろん、より高い分離レベルは、効率を低下させます。
MySQLデータベースのデフォルトの分離レベルは、反復可能読み取りです。
このレベルの直列化と同じように、(Javaのマルチスレッドのロックと同様に)ロックテーブルへの道は、他のスレッドがロックの外に待機することができ、どのような分離レベルの選択は、実際の状況に基づいている必要があります。
マジック読書(ファントムリード)
前提条件:InnoDBエンジン、反復可能読み取り分離レベルは、現在の使用をお読みください。
パフォーマンス:(読み取りビューの)取引クエリの後に前のクエリが見られなかった行を参照する際に、前と同じ範囲内の2つのクエリの後。二つの注意点:
1、反復可能読み取り分離レベルは、一般的なクエリは、スナップショットの読みであるマジックは、現在の読み取りに現れ読書、別のトランザクション挿入データは表示されません。
2、ファントムリードが新たに挿入された行に特異的に指し、元の更新の読み取り結果行を存在しません。現在の読みがあるので役割は、最新の記録された値が送信されたすべてを読むことができます。
ファントム読み取りの影響
- それはロックされていない後行に参加する条件を満たすために、最初の生成トランザクションロックになります。
- 予選ゴールラインを変更するには、トランザクションで、データの一貫性を生成しますが、トランザクションが参加する客観的な基準を満たす新しい行をコミットする前に。そのようなデータは、すべての適格なターゲット行が変更を加えることになるのbinlogによって回収されます。
理由ファントムは、生成読み取る
行ロックのみすべての行がロックされている場合でも、行をロックすることができ、新たに挿入された記録を停止することができます。
例えば、
最初のステップは、テーブルを作成し、5つのレコードを挿入するには:1,2,3,4,5
トランザクション1(オープン問い合わせはトランザクションのレコードが6を挿入していないことが判明):
、トランザクション2(オープン業務を一切記録6,6挿入は認められませんでした、そして、)トランザクションをコミット:
トランザクション1:問い合わせが何の記録6を認めなかったが、今6を挿入するように進みます:
レコードがすでに存在して挿入するように私に言っていない、多くの場合、ファントム読み取りと言われています。
ファントム読み取りを解決する方法
- 新しいレコードの挿入を防止するために、二列プラスロックとの間のギャップ、;ギャップロックと呼ばれるラッチ
- ギャップロッククリアランスロック間の競合関係はありません。ギャップとロック関係を競合する、このギャップは、この操作でレコードを挿入することです。
Serializableを直列化可能
これは、分離の最高レベルである
問題ファントムリードを解決するように、互いに競合することができなくなって、トランザクションの順序を強制することによって、それを。要するに、各リードのデータ線上に共有ロックを追加することです。
このレベルでは、タイムアウトやロック競合の多くにつながる可能性があり
、一般的に推奨されません。この分離レベルでは、汚れの前に現れ解決することができるが、非反復可能読み取りとファントムが問題を読み、読み、それはまた、タイムアウトやロック競合現象の多くにつながることができます使用しています。