分離レベルとの間の関係は、その関係のMySQLのMySQL分離レベルとロックをロック

 

 

関係のMySQL分離レベルとロック

 

まず、取引の四つの基本的な機能 

アトミック(不可分): 
トランザクションが動作を含む論理ユニットとして扱われます。論理演算ユニット 
どのようなすべての成功しました。どちらのすべてが失敗しました。

 

一貫性(一貫性): 
唯一の合法的なデータは、そうでない場合、トランザクションは元にロールバックする必要があり、データベースに書き込むことができる 
状態。

 

絶縁(アイソレーション)は: 
トランザクションが正のデータ破壊することなく、同じデータへの同時アクセスを複数のユーザが合意された 
精度と整合性を。同じ時間。並列トランザクションの変更は、他の並列トランザクションで修正されなければならない 
独立しています。 

耐久性(持続性): 
トランザクションの終了後。トランザクションの結果は、硬化することができます。 

 

第二に、データベースの分離レベル

データベースのトランザクション分離レベル4があります。ローからハイに続くREAD UNCOMMITTED、読み取りコミットし、反復可能読み取り、直列化可能。これらの4つのレベルが一つ一つ解決することができ、ダーティリード、繰り返し読むことができないファントムは、この種の問題を読み込みます。MySQLはその反復可能読み取りデフォルトの分離レベルを設定します。繰り返しレベルを読み取ることができます。

分離レベルを設定することができます。

 

 

√:×が発生する可能性があります表示されません。

  ダーティー読み取り 繰り返し読んでいません マジック読書
非コミット読み取り
コミット読みます ×
反復可能読み取り × ×
Serializableを × × ×

 

注意:私たちは、主に複数で、分離レベルのシナリオを議論の下で同時トランザクションの例。したがって、以下の説明では、トランザクションの同時実行性を包囲します。

 

 
コミットされていない非コミット読み取りを読みます

 

READ UNCOMMITTED分離レベルは、最も制限的です。以来、このレベルは、他のトランザクションのロックを無視します。UNCOMMITTED使用してトランザクション・レベルの操作をREAD、まだ他のトランザクションでコミットされていないデータ値の変化を読み取ることができ、そのような行動を読んで、「汚い」と呼ばれています。私たちは話している汚い、2つの同時トランザクション、「トランザクションA:singoにつながる賃金」を読み出し、「トランザクションB:singoクエリの給与口座」トランザクションBは、Aがまだ提出されていないデータのトランザクションを読み込みます。例えば、トランザクション1が行を変更し、トランザクションのトランザクション2は1提出する前に、この行を読み取ります。

トランザクションと仮定すると、ロールバック・トランザクション2は、データ行が提出されていません読み込みます。我々は、このデータが存在していないと感じています。

 

COMMITTEDコミットREADを読みます
このレベルは変更はなく、まだコミットされたデータ値ステートメントを指定し、他のトランザクションで読み取ることができません。 ダーティリードを実行している禁止 現在実行中の業務個々のステートメントの間では、 他のトランザクションは、まだ(まだ挿入および欠失を変更する権限を持っている、トランザクションBに焦点を当てたデータを、変更の挿入、または削除することができますので、農産物を繰り返し読むことができません 読み出し動作時に結果が繰り返すことはできません。または「影」のデータ。例えば、トランザクション 1行を読み出します。サービス2変更またはこの行を削除して提出します。トランザクションと仮定すると、1本のラインを読むためにもう一度たい、それが変更または取得するデータは、同じことが削除されていることがわかりました。したがって、第1、第2は、異なる結果を読み取るとの取引の結果の読み取り、したがって読み取り、繰り返し呼び出すことができません。

 

データベースのほとんどのデフォルトのレベルは、READ COMMITTEDです。たとえばSQL Serverの、Oracleの場合。どのように問題を解決するためには、何度も何度も読むことができません。分離レベルを見てください。

 非反復可能読み取りフォーカスが変更されます。 

反復可能読み取りを繰り返し読みます
よりREPEATABLE READ COMMITTEDより制限分離レベルREAD。

 

このレベルはREAD COMMITTEDが、現在のトランザクションがコミットする前に、それ以外の指定されました。それそれは(挿入することができます)現在のトランザクションデータが読み込まれたものを、トランザクションまたは削除に関係なく変更することはできません並行性はより低い READ COMMITTEDが。読み出しデータは、トランザクション全体の間で共有されているため、ロックを保持しているが、それぞれの文の最後に解放されません。

この分離レベルは、単に変更、および削除することはできません、と言うことですが、クエリの条件を満たすように、データの新しい行を挿入することはできません強制しません。

これは結論付けることができます:REPEATABLE READ分離レベルを2つのクエリ、同じクエリで同じトランザクションをそれを確実にするために。コンテンツの第2の読み取りを確実に最初の読み取りの内容をシフトしています。注意:MySQLのデフォルトの分離レベルが反復可能読み取りです。

 

 マジックリーディング焦点は、追加または削除することです。 

繰り返し読んで、ファントム読み取り

 

繰り返し読んトランザクションが、同じクエリで読み出したデータの値が変化しませんが、次のクエリに対して同じ条件を保証することはできませんことを保証することです。結果のレコード数が追加されません。

 

マジック読書が存在し、彼はこの照会の範囲をロックしていた問題を解決することです。だから我々は、この範囲内のデータを挿入するために下ることはできません。これは、SERIALIZABLE分離レベルをどうするかです。

 

 

シリアライズシリアライズ
SERIALIZABLE分離レベルは、ロックキーの全範囲のレベルは、最も限定的です。トランザクションが完了するまでロックを保持してきました。このレベルREPEATABLE READ。そして、追加のトランザクションが完了する前に、他のトランザクションは、トランザクションの範囲を限定するための新しい行が読み込まれた挿入することはできません。たとえば、トランザクション1は、検索基準を満たす行のシリーズを読み込みます。サービス実行中の2 一本の以上のラインを生成するためのSQL文は、総務部満たす行の競合1検索条件を。トランザクション2はロールバックされます。そして、トランザクション1が再び同じ検索基準を満たす行のシリーズを読んで。第二読取の結果と同一の最初の読み取りの結果。

 

 

第三に、ロック

 

ブロックまたは2つのロック?
デッドロックを防ぐために、同時アクセスを大量に与えられました。一般的なアプリケーションでは、法律の封鎖をお勧めします。プロセスの初期段階です。すでにデータが、すべてのロック解除方法の実行後、すべてのロックされ、その後、使用されるかを事前に知っています。

このように効果的にデッドロックを回避するが、データベースに適用されない、トランザクションの開始以来、データベースは、データが使用されるかわからないことができます。
データベースは、2相ロック・プロトコルに従う、トランザクションは、2つのフェーズ、フェーズロックに分割し、ステージのロックを解除する(そうツーフェーズロックと呼ばれます)

位相ロック:このフェーズロック操作で行うことができます。どんなにデータがのために適用され、S-ロック取得する操作を読んだ前に申請し、X-ロック(排他ロックの前に得るために、書き込み動作中に、(共有ロックを、他のトランザクションが共有ロックを追加していくことができますが、排他ロックを追加することはできません)他のトランザクションは)どんなロック取得することはできません。ロックは、トランザクションが正常に実行する続行する前にロックするまで待機している状態になり、失敗しました。
ステージのロックを解除:トランザクションのロックが解除段階に封鎖事務を解放するとき。唯一もはや操作にロックすることはできない。この段階で、操作のロックを解除することができます。


トランザクションロック/アンロックプロセスが
開始されます。 
テストにロック挿入部を対応する.....プラスINSERTは、
テストにSETを更新...プラスアップデート対応するロックは
テストから削除....プラス対応するロックは削除
コミット、トランザクションがコミットし、同じ時間放出インサートを、更新、削除対応するロック
な方法では、デッドロックにもかかわらず、避けることができません。しかし、同時トランザクションのスケジューリングがシリアライズ(直列化は、特にデータリカバリとバックアップでは、非常に重要である)のであることを確実にするために2フェーズロック・プロトコルに。

 

繰り返し読んで、ファントムは違いを読み取っていない
人は、両方のと少し似確かに、繰り返し読んで読んで、ファントムができません混同するのは非常に簡単です。

しかし、更新、削除に焦点を当て、繰り返し読むことができません。ファントム読み焦点が挿入されます。

 

これら二つの分離レベルを実現するためのロック機構を想定。繰り返しSQLデータへの最初の読み取りで読んで。これらのデータは、他のトランザクションがデータを変更することはできませんロックされます。繰り返し読むことができます達成することができます。しかし、この方法は、挿入データをロックすることはできません。トランザクションAが以前のトランザクションBが挿入データを提出することができた、データを読み取る、またはすべてのデータを変更するときに、そのトランザクションは、Aはありません前に、何とか、より多くのデータがあります。これは読みファントムです。行ロックを回避することはできません。

Serializableの分離レベルが必要です。読み取りロックを読む、書く、書き込みロックを、読み取りおよび書き込みロックは相互に排他的である、そうすることが効果的ファントムを防ぐことができます読んで、繰り返し読むことができない、ダーティ・リードやその他の問題が、大幅同時実行データベースを削減します。

だから、読んで、ファントムの最大の違いは、彼らが発生するメカニズムをロックすることによって、問題を解決する方法である読み込みを繰り返すことはできません。

上記の言った、それはこれらの2つの問題に対処するために悲観的ロック機構を使用することですが、MySQL、ORACLE、PostgreSQLと他の成熟したデータベース。パフォーマンス上の理由から、我々は両方の問題を回避するための理論的基礎として楽観的ロックでMVCC(マルチバージョン同時実行制御)を使用しています。

楽観と悲観的ロックは、ロック
悲観的ロック
外にあるデータを参照し、その名前のように、(システムが現在他のトランザクションが含まれており、外部のシステムからのトランザクション処理)保守的なアプローチに変化します。したがって、全体のデータ処理は、データがロックされています。悲観的ロックを実装します。多くの場合、データベースによって設けられたロック機構が依存している(また、唯一のロック機構才能データベース層でもこのシステムにロック機構を実現するために、それ以外の場合は、データへの排他的アクセスの本当の保証を提供している、システムが外部データを変更しないという保証はありません)。

 

悲観的ロックの場合は、トランザクション分離を保証するために、我々は、読取り一貫性をロックする必要があります。

データを読み取る際にロックするには、他のトランザクションがデータを変更することはできません。

また、データの変更を削除するときに、他のトランザクションがデータを読み取ることができませんロック。

楽観的ロック
は比較的悲観的ロック、よりリラックスしたロック機構を取ら楽観的ロック機構。排他操作の最大度を確保するために、ほとんどの場合、悲観的ロックを達成するために、データベースのロック機構に依存しています。しかし、オーバーヘッドの多くとは、データベースのパフォーマンスが続きました。特に、多くの場合、オーバーヘッドを買う余裕はない長いトランザクション、ため。

ある程度楽観的ロック機構は、この問題を克服します。楽観的ロック、データのバージョン(版)記録機構の実装の最も。どのようなデータのバージョン番号?すなわち、通常のデータベース・テーブル内の「バージョン」フィールドを追加することによって達成データベース表に基づいてソリューションのバージョン番号で、データを識別するためにバージョン番号を追加しています。

データを読み出すときは、このバージョン番号を読み出し、時に更新した後、このバージョン番号プラスワン。

この時。現在のバージョン番号情報との比較のために記録された送信データに対応するデータベーステーブルのデータのバージョン番号、データのバージョン番号が提出されたデータベーステーブルの数は、現在のバージョン番号が更新されると想定よりも大きいです。それ以外の場合は、古いデータを感じます。

MVCCの実現が決まった標準ではないことに留意すべきで、各データベースは異なる実装を持つことになり、ここでのInnoDBのMVCCを議論しました。

 

MySQLのInnoDB内で実装さMVCCをさ
InnoDB内で、MVCCを達成するために2つの追加の隠された値から、各ラインデータの後に追加されますが、これらの2つの値のデータのこの行が作成されたときの記録、データレコードの別のライン期限切れ(または削除)するとき。実際の動作では。ストレージではなく、時間が、トランザクションのバージョンは、各トランザクションは、バージョンがインクリメントされ、新しいトランザクションを開きます。場合に再読み込みすることができるトランザクション分離レベル反復読み取ります。

  • SELECT時間。バージョン<=現在のトランザクションのバージョンを作成するために読んでください。空または現在のトランザクションのバージョン>バージョンを削除します。

     

     

  • INSERT、行のバージョンを作成するために、現在のトランザクションの保存されたバージョン
  • DELETE、現在のトランザクション行の保存されたバージョンは、バージョンを削除しました
  • UPDATEでは、新しいレコードを挿入します。ラインバージョンのバージョンを作成するために、現在のトランザクションを保存し、同時に削除された行の元のバージョンに現在のトランザクションを保存します
  • MVCCすることにより、各ラインレコードは余分なストレージスペースを必要とするものの、他のラインの検査の多くだけでなく、いくつかの追加的な保守作業。ほとんどがロックを読んでいない。しかしロックの使用を減らすことができ、データは、操作が非常に簡単、非常に良好なパフォーマンスですが、またラインだけの基準を満たすために読み込むことを保証するために読んでください。行をロックすることのみが必要です。

     

     

我々は、データベースを教えるためにこの本から学ぶかどうか。上記大きなトランザクションを意味すると、このモジュールにリストされている4つの分離レベルであるか、またはネットワークから見た、RRレベルが反復可能読み取りであるが、ファントム読み取り解決することはできません。しかし、唯一のファントム内の溶液はSerializableレベルの才能を読みました。

だから私は、結果を表示するCトランザクションを追加しました。データteacher_idを追加= 1℃でトランザクションをコミット RRレベルは、クエリteacher_id = 1つのデータトランザクションがCに新たに追加されたデータを読み取り、取引時に、ファントム読み取り現象であるべきです。

しかし、MySQLので見つかったテストの後、そのような状況ではありません。Cは、トランザクションAは、まだこのデータを読んでいないされ、トランザクションの後に提出しました。MySQLはRRレベルで見ることができます。読み込みの問題は、読書の魔法に取り組んでいます。下図を参照してください。


 

Serializableを
このレベルは非常に簡単です。共有ロックを読みます。プラス排他書き込みロックは、読み込みと相互に排他的な書き込み。データをより安全な実装が容易、ペシミスティック・ロック・理論を使用してください。しかし、同時容量が非常に悪いです。あなたのビジネスの同時特別ほとんど、あるいはまったく同時同時間も、このようなモデルを使用することが可能である、タイムリーかつ信頼性の高いデータを要求したとします。

 

这里要吐槽一句,不要看到select就说不会加锁了。在Serializable这个级别,还是会加锁的。

 

 

參考文章:http://blog.csdn.net/fg2006/article/details/6937413

      http://www.cnblogs.com/xwdreamer/archive/2011/01/18/2297042.html

      http://case0079.iteye.com/blog/205201

      http://www.jb51.net/article/75452.htm

 

一、事务的4个基本特征 

Atomic(原子性): 
事务中包括的操作被看做一个逻辑单元。这个逻辑单元中的操作要 
么所有成功。要么所有失败。

 

Consistency(一致性): 
仅仅有合法的数据能够被写入数据库,否则事务应该将其回滚到最初 
状态。

 

Isolation(隔离性): 
事务同意多个用户对同一个数据进行并发訪问,而不破坏数据的正 
确性和完整性。同一时候。并行事务的改动必须与其它并行事务的改动 
相互独立。 

Durability(持久性): 
事务结束后。事务处理的结果必须可以得到固化。 

 

二、数据库隔离级别

数据库事务的隔离级别有4个。由低到高依次为Read uncommitted、Read committed、Repeatable read、Serializable。这四个级别能够逐个解决脏读、不可反复读、幻读这几类问题。MySql设置的隔离级别默觉得Repeatable Read。可反复读级别。

隔离级别能够配置。

 

 

√: 可能出现    ×: 不会出现

  脏读 不可反复读 幻读
Read uncommitted
Read committed ×
Repeatable read × ×
Serializable × × ×

 

注意:我们讨论隔离级别的场景,主要是在多个事务并发的情况下。因此,接下来的解说都环绕事务并发。

 

 
Read uncommitted 读未提交

 

READ UNCOMMITTED是限制性最弱的隔离级别。由于该级别忽略其它事务放置的锁。使用READ UNCOMMITTED级别运行的事务,能够读取尚未由其它事务提交的改动后的数据值,这些行为称为“脏”读。我们所说的脏读,两个并发的事务,“事务A:领导给singo发工资”、“事务B:singo查询工资账户”,事务B读取了事务A尚未提交的数据。比方,事务1改动一行,事务2在事务1提交之前读取了这一行。

假设事务1回滚,事务2就读取了一行没有提交的数据。这种数据我们觉得是不存在的。

 

Read committed 读提交
该级别通过指定语句不能读取其它事务已改动可是尚未提交的数据值。 禁止运行脏读。在当前事务中的各个语句运行之间, 其它事务仍能够改动、插入或删除数据(重点是事务B仍然具有改动插入和删除的权限,所以产生不可反复读。从而产生无法反复的读操作。或“影子”数据。比方,事务 1读取了一行。事务2改动或者删除这一行而且提交。假设事务1想再一次读取这一行,它将获得改动后的数据或者发现这一样已经被删除。因此事务的第二次读取结果与第一次读取结果不同,因此也叫不可反复读。

 

大多数数据库的默认级别就是Read committed。比方Sql Server , Oracle。怎样解决不可反复读这一问题。请看下一个隔离级别。

 不可重复读的重点是修改: 

Repeatable read 反复读
REPEATABLE READ是比READ COMMITTED限制性更强的隔离级别。

 

该级别包含READ COMMITTED,而且另外指定了在当前事务提交之前。其它不论什么事务均不能够改动或删除当前事务已读取的数据(可以插入)。并发性低于 READ COMMITTED。由于已读数据的共享锁在整个事务期间持有,而不是在每一个语句结束时释放。

这个隔离级别仅仅是说,不可以改动和删除,可是并没有强制不能插入新的满足条件查询的数据行。

此可以得出结论:REPEATABLE READ隔离级别保证了在同样的查询条件下,同一个事务中的两个查询。第二次读取的内容肯定包换第一次读到的内容。注:Mysql的默认隔离级别就是Repeatable read。

 

 幻读的重点在于新增或者删除: 

反复读与幻读

 

反复读是为了保证在一个事务中,相同查询条件下读取的数据值不发生改变,可是不能保证下次相同条件查询。结果记录数不会添加。

 

幻读就是为了解决问题而存在的,他将这个查询范围都加锁了。所以就不能再往这个范围内插入数据。这就是SERIALIZABLE 隔离级别做的事情。

 

 

Serializable 序列化
SERIALIZABLE 是限制性最强的隔离级别,由于该级别锁定整个范围的键。并一直持有锁,直到事务完毕。该级别包含REPEATABLE READ。并添加了在事务完毕之前,其它事务不能向事务已读取的范围插入新行的限制。比方,事务1读取了一系列满足搜索条件的行。事务2在运行SQL statement产生一行或者多行满足事务1搜索条件的行时会冲突。则事务2回滚。这时事务1再次读取了一系列满足同样搜索条件的行。第二次读取的结果和第一次读取的结果同样。

 

 

三、锁

 

一次封锁or两段锁?
由于有大量的并发訪问,为了预防死锁。一般应用中推荐使用一次封锁法。就是在方法的開始阶段。已经预先知道会用到哪些数据,然后所有锁住,在方法执行之后,再所有解锁。

这样的方式能够有效的避免循环死锁,但在数据库中却不适用,由于在事务開始阶段,数据库并不知道会用到哪些数据。
数据库遵循的是两段锁协议,将事务分成两个阶段,加锁阶段和解锁阶段(所以叫两段锁)

加锁阶段:在该阶段能够进行加锁操作。在对不论什么数据进行读操作之前要申请并获得S锁(共享锁,其他事务能够继续加共享锁,但不能加排它锁),在进行写操作之前要申请并获得X锁(排它锁,其他事务不能再获得不论什么锁)。加锁不成功,则事务进入等待状态,直到加锁成功才继续运行。
解锁阶段:当事务释放了一个封锁以后,事务进入解锁阶段。在该阶段仅仅能进行解锁操作不能再进行加锁操作。


事务                       加锁/解锁处理
begin。 
insert into test ..... 加insert相应的锁
update test set... 加update相应的锁
delete from test .... 加delete相应的锁
commit; 事务提交时,同一时候释放insert、update、delete相应的锁
这样的方式尽管无法避免死锁。可是两段锁协议能够保证事务的并发调度是串行化(串行化非常重要,尤其是在数据恢复和备份的时候)的。

 

不可反复读和幻读的差别
非常多人easy搞混不可反复读和幻读,确实这两者有些相似。

但不可反复读重点在于update和delete。而幻读的重点在于insert。

 

假设使用锁机制来实现这两种隔离级别。在可反复读中,该sql第一次读取到数据后。就将这些数据加锁,其他事务无法改动这些数据。就能够实现可反复读了。但这样的方法却无法锁住insert的数据。所以当事务A先前读取了数据,或者改动了所有数据,事务B还是能够insert数据提交,这时事务A就会发现莫名其妙多了一条之前没有的数据。这就是幻读。不能通过行锁来避免。

须要Serializable隔离级别 。读用读锁,写用写锁,读锁和写锁相互排斥,这么做能够有效的避免幻读、不可反复读、脏读等问题,但会极大的减少数据库的并发能力。

所以说不可反复读和幻读最大的差别,就在于怎样通过锁机制来解决他们产生的问题。

上文说的,是使用悲观锁机制来处理这两种问题,可是MySQL、ORACLE、PostgreSQL等成熟的数据库。出于性能考虑,都是使用了以乐观锁为理论基础的MVCC(多版本号并发控制)来避免这两种问题。

悲观锁和乐观锁
悲观锁
正如其名,它指的是对数据被外界(包含本系统当前的其它事务,以及来自外部系统的事务处理)改动持保守态度。因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现。往往依靠数据库提供的锁机制(也仅仅有数据库层提供的锁机制才干真正保证数据訪问的排他性,否则,即使在本系统中实现了加锁机制,也无法保证外部系统不会改动数据)。

 

在悲观锁的情况下,为了保证事务的隔离性,就须要一致性锁定读。

读取数据时给加锁,其他事务无法改动这些数据。

改动删除数据时也要加锁,其他事务无法读取这些数据。

乐观锁
相对悲观锁而言,乐观锁机制採取了更加宽松的加锁机制。悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。但随之而来的就是数据库性能的大量开销。特别是对长事务而言,这种开销往往无法承受。

而乐观锁机制在一定程度上攻克了这个问题。乐观锁,大多是基于数据版本号( Version )记录机制实现。何谓数据版本号?即为数据添加一个版本号标识,在基于数据库表的版本号解决方式中,通常是通过为数据库表添加一个 “version” 字段来实现。

读取出数据时,将此版本号号一同读出,之后更新时,对此版本号号加一。

此时。将提交数据的版本号数据与数据库表相应记录的当前版本号信息进行比对,假设提交的数据版本号号大于数据库表当前版本号号,则予以更新。否则觉得是过期数据。

要说明的是,MVCC的实现没有固定的规范,每一个数据库都会有不同的实现方式,这里讨论的是InnoDB的MVCC。

 

MVCC在MySQL的InnoDB中的实现
在InnoDB中,会在每行数据后加入两个额外的隐藏的值来实现MVCC,这两个值一个记录这行数据何时被创建,另外一个记录这行数据何时过期(或者被删除)。 在实际操作中。存储的并非时间,而是事务的版本,每开启一个新事务,事务的版本就会递增。 在可重读Repeatable reads事务隔离级别下:

  • SELECT时。读取创建版本<=当前事务版本。删除版本为空或>当前事务版本。

     

     

  • INSERT时,保存当前事务版本为行的创建版本
  • DELETE时,保存当前事务版本为行的删除版本
  • UPDATE时,插入一条新纪录。保存当前事务版本为行创建版本,同一时候保存当前事务版本到原来删除的行
  • 通过MVCC,尽管每行记录都须要额外的存储空间,很多其它的行检查工作以及一些额外的维护工作。但能够降低锁的使用,大多数读操作都不用加锁,读数据操作非常easy,性能非常好,而且也能保证仅仅会读取到符合标准的行。也仅仅锁住必要行。

     

     

我们无论从数据库方面的教课书中学到。还是从网络上看到,大都是上文中事务的四种隔离级别这一模块列出的意思,RR级别是可反复读的,但无法解决幻读。而仅仅有在Serializable级别才干解决幻读。

于是我就加了一个事务C来展示效果。在事务C中加入了一条teacher_id=1的数据commit。RR级别中应该会有幻读现象,事务A在查询teacher_id=1的数据时会读到事务C新加的数据。

可是測试后发现,在MySQL中是不存在这样的情况的。在事务C提交后,事务A还是不会读到这条数据。可见在MySQL的RR级别中。是攻克了幻读的读问题的。參见下图


 

Serializable
这个级别非常easy。读加共享锁。写加排他锁,读写相互排斥。使用的悲观锁的理论,实现简单,数据更加安全。可是并发能力非常差。假设你的业务并发的特别少或者没有并发,同一时候又要求数据及时可靠的话,能够使用这样的模式。

 

这里要吐槽一句,不要看到select就说不会加锁了。在Serializable这个级别,还是会加锁的。

 

 

參考文章:http://blog.csdn.net/fg2006/article/details/6937413

      http://www.cnblogs.com/xwdreamer/archive/2011/01/18/2297042.html

      http://case0079.iteye.com/blog/205201

      http://www.jb51.net/article/75452.htm

 

おすすめ

転載: www.cnblogs.com/mengbin0546/p/10987679.html