MySQLのトランザクション分離レベルおよび特性にラフ

ノートの理解として - すでに飽和し、オンラインの記事のために、また、その理由は非常に単純であることを書きました。

序文

あなたが学ぶように、この記事で、MySQLいくつかの個人的な理解を、エンジンが使用しますInnoDb話の最初の取引におけるコンセプト、《高性能MySQL》第三版その中に総務このように述べました:

トランザクションは、アトミックSQLクエリのセット、または仕事のスタンドアロンユニットです。データベースエンジンが正常にデータベースアプリケーションを照会し、すべてのステートメントは、クエリを実行することができます。クラッシュやその他の理由の法的強制力がないとして、これらのステートメントのいずれかの場合は、すべてのステートメントは実行されません。

言い換えれば、トランザクションはユニット全体でSQL文は、一般的にはいくつかの商品のように、一人で実行する複数のコンポーネントで構成されていませんが、私は間違いなく、個別のコンポーネントを販売していないだけで商品を購入する、またはではありません販売しています。

ビジネスの簡単な理解した後、また、取引の目的を知っている必要がありますすることですデータの正確性と一貫性を確保し、この目的のために、それはから生まれている4特性(当時の詳細に入る)、およびこれらの4つの特性を達成するためにと用を含む多くの具体的な実装で、必要となるアイソレーションが生成4つの分離レベルを、4つの分離レベル生産している3つの問題脏读不可重复读および幻读)を、そしてこれは彼らのおおよその関係である、のは、見てみましょう最後にこれらの特定は何ですか。

特性の1四種類(ACID)

取引の特徴といえば、それは確かに口の中で来たACIDに加えて、しかし、ACID私たちが何かを言う必要がポイントの外。

原子性(Atomicity):というこの手段トランザクションが成功するか、すべての実行は行わないか、すべての不可分の最小単位で、トランザクション全体の動作として扱われるべきであるが、(DOはQuark社について私に話していない)不可分として原子のように、ここで行う実装を成功さを指し、その後、すべての実行されていない操作を実行するために障害が発生した場合、それは、我々は通常、ロールバックを見たものです。

一致性(Consistency):本の中で与えられた意味がある事項は常に一貫性の状態から別の一貫した状態にジャンプ私の理解では、例えばすべてを取得するためにお金を転送、データの全体が変更されていない、と言うことですつまり、保存されたデータの範囲に関与しているAに転送アカウントB``200ドル、その後作らAB、このデータ範囲の構成彼は、データが言っ変更されていない(-200+200=0)しかし、データがどのように変化するかの組成は、それが1つの整合性のある状態からある- >別の一貫した状態。

隔离性(Isolation)一般的に言えば、一般的な問題に言うことです表示されていない他のトランザクションのトランザクションの動作は独立しています。しかし、関連するデータベースと、この分離レベルは、他に-分離レベルの外側(はい、あなたが読んでコミットされていない学生)、その他は、表示されていない、そしてこのトランザクションレベルはほとんど使用されません見たことそれは、「一般的に言えば」です。

持久性(Durability)トランザクションが完了すると、トランザクションによるデータ変更を永続的になり、(別のトランザクションが変更されない限り)変更されません。しかし、これは実際に戦略の実施に関連した本の中で言及されているが、それは遠く離れて少しだ(はい、私は知りません!)。

これらは、業務のある特性の四種類、しかし、の実現は、分離レベルの分離は、データベースに依存しています。

データベース分離レベル2

MySQL分離レベルが存在する4種類の異なるが、それぞれ対応するトランザクション分離レベルも異なる可能性のある問題を反映しています。

未提交读(read uncommited):この分離レベルでは、操作は、その他の事項を提出していないトランザクションも見ることができても実行しました。トランザクションでこのレベルで表示されることがあり、他のトランザクションから提出されたダーティ・データ読まない場合があり、ダーティ・リードを以下に示すように、番号は実行順序を示しています。

IMG

インタフェースで見ることができる1まで、トランザクションのtestデータを挿入し、この時間は偶数ページが提出していないテーブル2も、別のトランザクションによって提出されたデータを見ることができます。

提交读(read commited)トランザクションがコミットされた後、他のトランザクションが変更されたトランザクションを見ることができます同じクエリを表示されることがあり、この分離レベルは、同じトランザクションを実行しているが、その、異なるデータが読み出され、非反復可能読み取りnonrepeatable read)、別の非コミット読み取りは、非反復可能読み取りを生じる可能性があります。例としては、次のとおりです

IMG

​​  可重复读(repeatable read)这是MySQL的默认隔离级别在事务开始的时候会保存此刻的一个快照(这里啰嗦一下,实际上是开启事务后执行第一条语句的时候准备的快照,准备快照的方法则是记录当前事务的版本号,没有进行数据的复制,不明白事务版本号或隐藏字段的可以看看MySQLMVCC),然后接下来这个事务的所有数据读取都是从这个快照读,所以不会出现不可重复读的情况,但是还是有可能出现幻读。意思就是读取的是快照表数据不会变化,但是进行写操作如更新的时候更新的数量可能会跟预期的不同。如图

IMG

​​  可以看到,在界面1插入一条记录并且提交之后,界面2还是没有读到这个提交的数据,因为他是从事务开始时的快照表读取的所以自然是读不到的,但是在进行更新操作的时候则是更新了意料之外的记录,这就是一种幻读的现象。

​​  可串行化(serializable):意思就是事务要一个一个来,如果在一个事务中进行读操作,那么其他事务在该事务完成前只能进行读操作;如果进行写操作,那么其他事务的操作都进入等待(直到当前事务提交)。这种级别就可以防范目前出现的脏读、不可重复读、幻读等现象。如图

IMG

上图演示的是事务读时,其他事务不可写,下图是写时不可操作。

IMG

3 三个问题—脏读、不可重复读、幻读。

​​  这是采取事务的不同隔离级别可能产生的几个问题,在上面隔离级别已经提及到了,但是为了避免混淆还是单独拿出来。

  • 脏读:ダーティデータにはまだ取引がで開催された提出していないその他の事項読みを指しREAD UNCOMMITTEDレベル。
  • 不可重复读:トランザクションで異なる結果が表示されることがあり、同じクエリがで行われたREAD UNCOMMITTED、コミットレベルを読み出します(個人的に私は、コールが紛らわしい、繰り返すことはできませんと呼ばれ、具体的かを理解する必要を感じていません)
  • 幻读:場合、そのようなデータの前にクエリへの変更など、さまざまな期待、多数の変更の数との取引における書き込み動作。

いくつかは、長ったらしい不可重复读幻读区別は:のように理解することができる不可重复读是のピース記録フィールド値の変更は、例えばidする1記録name二つの値が異なる;しかし幻读、それはある量の異なった、例えば、Iは総チェック場合2レコードをしかし、変更操作は、更新されたとき3の記事を。






参考: "高性能のMySQL"、http://www.zsythink.net/archives/1233/

おそらく、私は単純に認識されるようにしたいです。

おすすめ

転載: www.cnblogs.com/zhangweicheng/p/12273797.html