著者:料理スタジオを洗ってはいけない - Hotown
記事ソース:データベースのトランザクション分離レベル
データベースでは、単一の作業論理単位が設定されている構成する独立したユニットとして動作する、私たちが多いコレクションは、と呼ばれる取引。
トランザクションモデル
データベース保守システムは総称として知られている4つのトランザクションの特性、必要ACIDを、それぞれアトミック(原子性)、一貫性(整合性)、分離(単離)、永続性(耐久性)。
単純なトランザクションモデル
我々はT、そのSQLおおよそ次のような形式で、このモデルを指定します。
- 操作1:10元の純アカウント UPDATEをアカウントのSET金額=金額- 10 WHERE USER_NAME = ' A ' - 操作2:Bアカウント10元を増やす UPDATEをアカウントのSET金額=金額+ 10 WHERE USER_NAME = ' Bを'
Tは、単純な伝達モデル、ユーザアカウントのユーザBに10元です。
その後、我々は、トランザクションの4種類の特性を説明するために、このトランザクションモデルを使用しています。
アトミック
アトムの表現は、一連の操作は、着脱不能、単一の会社に含まれています。いずれかの操作のトランザクションが失敗すると、それはデータベースがトランザクション全体の実行前の状態にロールバックされることを確認する必要があります。
トランザクションTでは、二つの動作、B口座に口座に控除A $ 10百万円の増加があります。2つの操作が不可分です。
我々は二つの別々のトランザクションように、これらの2つの事業を展開している場合は、それが初期状態と想定されます。
アカウント:100元の
アカウントB:100元
我々は今、行う操作Aを、口座残高が90になります。すると、その後!いくつかの制御不能な力によるサーバルーム、爆発がありました。そして、最終的な結果はとなります。
アカウント:90元の
アカウントB:100元
AとBは、無限の涙の力を開始します。。
B:あなたは私がお金を移す与えます!
A:私はああターン!あなたは私のアカウントが10元を控除されています参照してください!
B:私はああ受け取っていません!自分自身、または100元を参照してください!
......
第二に、一貫性
一貫性の原則は、データベースを変更しないトランザクションの一貫性の実行を必要とします。これは、トランザクションが実行された後、データベースが一貫している場合、トランザクションの実装前に、この一貫性が残っている、です。
トランザクションへのTは、例えば、T、Aの合計とBの口座残高の実装前に、我々はTの実施後、口座残高がAの和であることを確認する必要がありますし、Bはまだ$ 200、$ 200。
三、持久性
永続性要件の原則は、トランザクションが正常に実行され、データベースに送信完了すると、このアップデートは、長期的になります。言い換えれば、トランザクションのコミット後に限り、トランザクションがすべてのシステム障害の成功実装であるとして、これを元に戻すことはできません。
この概念は、一度ダウンし、すべてのデータが消えてしまいます、その後、我々は、外部のディスクにデータを送信記録を作成し、データベース内の情報を更新する必要があり、そのようなトランザクションの結果をメモリに格納されている場合など、いくつかの小さな抜け穴であってもよく、ダウンタイムの後、再起動前の状態は悲しいに復元することができます。この概念は、私たちの議論の範囲に属していないので、私はここでそれらを繰り返すことはしません。
第四に、アイソレーション
分離は確実に状態はシリアル実行に相当した後、特定の順序に取引との取引の同時実行した後にシステムの状態を。
同時に実行する複数のトランザクションがある場合は、でも私たちは、これらの操作の実装では、トランザクションの原子性と一貫性を確保する場合も厳密にシリアルではありませんが、非常に目に見えるラインではありませんいくつか目に見えない形で、クロスの実装それは矛盾に、最終的な状態を引き起こす可能性があります。
栗の場合は、トランザクションTは、オペレーティング・セグメントにトランザクションT1、およびT1として記録私たちの前に、彼らは実際にシステムで動作するおおよそ次のようにする必要があります
/ * * *読む(X):リードトランザクション主記憶バッファの動作を実行するためにデータベースから透過したX * *書き込み(X):メインメモリ書込みトランザクションのバッファのXを取り出し、書き込みを実行していますバックデータベースに(実際には、最初は無視コミットプロセスがある) * / リード(A) := A - 10 、 書き込み(A); リード(B); B:= B + 10 ; ライト(B)。
加えて、我々はさらにT2、演算値A + Bを定義します。
読み取り(A)。 読み取り(B)。 A:= A + B。
どのように同時トランザクションは、それを強制するのだろうか?我々は幸運であれば、それは完全に注文T1で実行することができる、T2は、その後、我々は一時の最終ステータスが200である必要があり得ます。
しかし、状況は、T1が成功借方であり、データベースに切断し、Bのバランスを増大させるために行われる動作、及び完了していないが、完全に行った場合、発生した場合、B := B+10
変数Bはないが、後に開始したT2を変更され、それはデータベースに書き込まれていない、TEMPで算出さT2は90 + 100 = 190となります。
一般的なプロセスは次のようになります。
- Tlの 読み取り(A): A:= A - 10 ; (A)を書く; - Aは90に、データベース内の値で 読む(B); B:= B + 10 ; - Bはありません変更が、データベースにコミットされていない - T2 リード(A); - 90 = 読む(B); - B = 100(110ない) TEMP:= + Bが、- 190を与えるために - TLの 書き込み(B)- 本明細書中にBがデータベースにコミットされる修飾
分離、データベースシステムを確保するために、存在する並行性制御システムこの責任を達成するために、。
トランザクション分離レベル
トランザクション分離レベルの導入前、導入する最初のダーティリード、ファントム読み取り、反復不能読み取りコンセプトを。
汚れは、ファントム読み込み、非反復可能読み取りを読み込み
- ダーティ読み取り:ダーティリードは、データアクセスにおけるトランザクションとは、このデータを変更するが、あなたがコミットする前に、別のトランザクションでも同じデータにアクセスし、変更を行ったときにことを意味します。次のようにモデルは、大きく(ここで前に無視するために使用されるコミット操作を、この操作は、トランザクションが完了した後、提出状況を入力することを意味します):
- T1の リード(A)。 A:= A + 1 。 WRITE(A)。 - T2の リード(A)。 A:= A + 2 。 WRITE(A)。 コミット; - T1は コミット。
- 非反復可能読み取り:トランザクションを意味し、同じデータを2回読み出しているが、取引時に(第2の前に読んで、最初の読み取りの後に)完了していない、別のトランザクションが読み込み同じデータ、及び改訂は、それは、一貫性のない重複データが読み込まれるまで反復不能読み取り状態の形成を導きました。
- A = 10、初期状態を想定 - Tlの 読み取り ;(A)- ; A = 10 - T2 読む;(A) A = A + 10 ; WRITE(A)は、 コミット ; - A = 20です。 - Tlの 読み取り(A); - A = 20は、最初は異なります
- マジックを読む:魔法の読書は、トランザクションの二つの非独立した実行の場合に発生します。次のSQLを使用して、この状況を示しています。
- T1の UPDATEのユーザーSETステータス= 1 。 - T2の 挿入ユーザー( `status`)の値(' 0 ')
その後、ユーザーは0が存在し、どのようにしても、すべてのユーザー状態がああ、設定されていることを知って驚いT1の動作を行いますか??????
トランザクション分離レベル
-
シリアライズ(直列化):SQL最高の分離レベルは、非反復可能読み取り、ファントムを読み出し、ダーティ・リードを回避することができます。コストは比較的重いです、それは非常にデータベースのパフォーマンスに影響します。
-
反復可能読み取り(反復可能読み取り):データのみを読み取ることができるが送信されました、と2つのデータ項目の間に1つのトランザクションで読み込み、他のトランザクションがデータを更新することはできません。この状態は、ファントム読み取りを防止することはできません。
-
コミット読み取り(コミット読み取り):コミットされたデータだけを読みますが、反復可能読み取りを必要としません。だけ回避することができ、この状態ダーティ・リード。
-
非コミット読み取りは、(非コミット読み取り):コミットされていないデータを読み込むことができます。これは、ダーティ・リード、ファントム読み取り、非反復を回避することができない読み出し分離の最も低いレベルです。
注意:すべての分離レベルが許可していない汚れた書き込みデータ項目が、まだ別に提出されていないか、または書かれて終了した場合、トランザクションが、それは書き込みのために他の業務を許可していません。