2012-03-23 2 views
6

私はJDBCを使ってMySQLでファントムの読み取りを実証しようとしています。 REPEATABLE-READ分離レベルの下では、ファントムが可能でなければならないことを理解しています。しかし、私は起こることができません。次のように私の取引が設定されていますREPEATABLE-READ分離レベルでMySQLにファントムを作成しようとしています

トランザクション1:

querySetOne[0] = "use adventureworks"; 
querySetOne[1] = "select * from vendorcontact where ContactTypeID between 10 and 30"; 
querySetOne[2] = "select sleep(20)"; 
querySetOne[3] = "select * from vendorcontact where ContactTypeID between 10 and 30"; 
querySetOne[4] = "COMMIT"; 

トランザクションを2:私はB/C私は(のStatement.executeを使用している配列でそれらを持っている

querySetTwo[0] = "use adventureworks"; 
querySetTwo[1] = "select sleep(2)"; 
querySetTwo[2] = "insert into vendorcontact values (105, 700, 20, NULL)"; 
querySetTwo[3] = "COMMIT"; 

)メソッドを使って各行を実行し、自動コミットをfalseに設定しました。

なぜquerySetOne [1]とquerySetOne [3]のクエリは、繰り返し可能な読み取り分離レベルで同じ結果を返しますか?

+0

この質問を読む:[?ファントムを生成する方法は、読み込み](http://stackoverflow.com/questions/5444915/how-to-produce-phantom-reads) –

答えて

0

REPEATABLE READではファンティームを使用できません。ファントムはREAD COMMITTEDの結果です。これがRRとRCの主な違いです。私は最近、2つの分離レベルを説明しているブログ記事を書いています。それらはしばしば混乱します。http://blog.9minutesnooze.com/repeatable-read-read-committed/

+0

さて、私は、データベースエンジンを切り替えましたMyISAMへ。今では、すべての分離レベルでファントムが生成されます(そして生成します)...なぜ、MyISAMでファントムを生成するSERIALIZABLE分離レベルですか?第1の終了まで2番目のトランザクションをブロックしませんか? – user1251858

+0

MyISAMはトランザクション型のストレージエンジンではないため、REPEATABLE READ/READ COMMITTEDなどは無効です。デフォルトでMySQLとともに出荷されるエンジンから、InnoDBを使用する必要があります。 –

3

SQL標準では、反復可能な読み取り分離ではファントム読み取りが可能であると言われていますが、

特に、MySQLのInnoDBエンジンは、反復可能な読み取り分離の下でconsistent readsをサポートしています。つまり、トランザクションの最初の読み取りでスナップショットが作成され、後でトランザクションで同じ読み取りが使用されます。すべての一貫性のある、同じトランザクション内で読み込ん

最初の読み取りによって確立されたスナップショットをお読みください。

MySQL documentationはこれについて反復可能読み取り分離は言います。この規約では、同じトランザクション内でいくつかのプレーン(非ロック)SELECTステートメントを発行すると、これらのSELECTステートメントはお互いにも一貫しています。

関連する問題