まず、テーブルのアカウントを作成します。テーブルを作成する処理は、スキップ(InnoDBストレージエンジンは、トランザクションをサポートするので、テーブルストレージエンジンをInnoDBのに設定されているため)。次のようにコンフィギュレーション・テーブルには、次のとおりです。
そして、次の結果を挿入した後、二つのテーブルにデータを挿入します。
問題を説明するために、私たちは二人のユーザ(ユーザAとユーザBとして当分の間、右)をシミュレートし、現在のMySQLセッションのトランザクション分離レベルを設定するためにログインするためのオープン2つのコンソールです。
A.リードがコミットされていない(非コミット読み取り)
特定のユーザAは、次のように動作しました:
設定されたセッションのトランザクション分離レベルを非コミット読み、 トランザクションを開始。 選択 * から アカウント。
結果は以下の通りであります:
ユーザBの操作は次のよう:
非コミット読み取りセッションのトランザクション分離レベルを設定します。 トランザクションを開始。 アカウント更新 設定 アカウント=アカウント+ 200 ID = 1 。
その後、我々は次のような結果を持つユーザーにデータを照会します:
結論
トランザクションがコミットしなかった場合でも、当社は、トランザクション分離レベルは、READ UNCOMMITTEDによ、我々はまだ分離のすべての種類の最低レベルである、コミットされていないデータを読み取ることができます
だから、何か質問がありますか?
私たちが何気なくかなり面倒である取引その他のコミットされていないトランザクション内のデータを読み取ることができることを、我々はと呼ばれるダーティリードを。私の名前は私たちが考えることができる印象を高めるために、どのように再生されるか分からない、この取引は、誰もが、本当に汚い、BAHを待つことができない提出しなかったことも、物事に空腹良い軽薄なああです!
実際には、私たちのデータが変わったのか?
答えはノーです、データベースのデータが変更されていない内部のデータベースがトランザクションのコミット後にのみ更新されますので、。
二つ。---(提出他のトランザクションからのデータを読み取るために)コミット読むほとんどのデータベースのデフォルトの分離レベル
同じように、私たちは、ユーザBの現在のトランザクション分離レベルはコミット読み取りにセッションになります。 私たちは、次の操作を実行するユーザーセッション:
。アカウントの更新アカウント-SET 200は、アカウントID = = 1です。
私たちは200で、ID =ユーザー1を占めることになります。その後、お問い合わせは、ID = 1つのユーザーアカウントが800となりました。
ユーザーのクエリセッションでB:
-
select * from account;
結果は以下の通りであります:
私たちは、データが変更されていないことがわかり、または1000。
その後、我々はセッションAにトランザクションを提出します。
コミット;
次のようにセッションBでは、クエリ結果は以下のとおりです。
結論2:
我々は現在のセッションをコミット分離レベルが読み込まれる設定すると、現在のセッションのみがコミットされていないデータを読み取ることはありませ提出し、他の取引データを読み込みます。
だから、何か質問がありますか?
それは我々が同じトランザクションBのセッションでは、2つの異なる結果を読んだものです。これは、非反復可能読み取りをもたらした、それは二つの異なる読み取りの結果です。この現象は、非反復可能読み取りと呼ばれています。
三。反復可能読み取り(再読み込みすることができます)--- MySQLのデフォルトの分離レベル
今需要があるということです、上司は同じトランザクション結果のクエリが一致していなければならないと述べ、あなたがデータベースであれば、どのように行うのでしょうか?データベースがやっています。
私たちは、セッションBトランザクション分離レベルに現在あることは反復可能読み取りです。次のように具体的な動作は以下のとおりです。
設定されたセッションのトランザクション分離レベル反復可能読み取り、 トランザクションを開始。
そして、セッションBのデータを照会:
私たちは、ユーザーが配置されているデータセッションを追加するテーブルを占めます。
挿入 に アカウント(ID、アカウント)値( 3 、 1000年 )。 コミット;
その後、我々は、データ挿入のクエリを見て成功しています。
戻るユーザーBが、我々は結果を照会セッションに:
ユーザBは、彼がの新しいデータセッションID = 3、値= 1000を挿入したいと考えています。私たちは、への下で動作します。
何?実際に得ることができませんでした、私は、データの重複を言うの?
ユーザBは、に満足していないもちろん、ああ、データへのクエリが2つだけああので、なぜ私はそれを繰り返すID = 3つのデータを挿入しますか?
私は再びそれを参照してください、私のめまいはしますか?
ただ、互いに分離されなければならない実際のユーザAとユーザBを見て、私たちはお互いに何をするか分かりません。ユーザBは、この現象、確かに揚げ髪ああ、明らかにデータが存在しない場合に遭遇し、主キーはデータの繰り返しID = 3に挿入されていると言います。
結論3:
私たちの現在のセッションの分離レベルが反復可能読み取りに設定されている場合は、現在のセッションが読み取りを繰り返すことができ、それぞれの時間を読んで、結果セットにかかわらず、他の事項のが提出されていない、同じです。
問題はありますか?
気に誰が、要件のボスは満たすことができます。読み出しトランザクション(反復可能読み取り)へのデータと一致。私は、ああ、腫れ顔が脂肪をロードし、それを行うことができます。データが変更されているが、私はまだ一致している必要があります。ただし、ユーザーBが直面する問題があり、ファントムと呼ばれる現象が読んで(魔法読んで、ああ何であるか最後に、この場所で長時間もつれを覚えておいてください)。
四。直列化(シリアライズ)
同様に、我々は、ユーザBは、シリアライズとターン情勢に設定されているセッションのトランザクション分離レベルをでしょう。
設定され 、シリアライズセッションのトランザクション分離レベル。 トランザクションを開始。
セッションユーザーBでは、私たちは、次の操作を実行します。
選択* からアカウント。
結果は以下の通りであります:
その後、我々は、ユーザAのセッションでそれまで今回データを書き込みますか?
私たちは、タイムアウトが(この時間は設定できます)、ヒントを待ち時間がロックアウトされます場合、ユーザは、待機に入るセッションが見つかりました:
ユーザーの皆様を待っている間にセッショントランザクション場合、ユーザーは成功した操作を促すメッセージが表示されますトランザクションを書き込み、Bが配置されて提出します。
結論4:
私たちは、シリアライズに、現在のセッションの分離レベル他のセッションがテーブルに書き込む際場合は中断されます。あなたは、これは最も厳しい分離レベルで、見ることができますが、そうすることは、必然的にパフォーマンスに影響を与えます。だから、実際の選択は、私たちは現在、特定の状況に適切な選択をしたいです。