2012-03-23 28 views
6

我试图通过使用JDBC来演示在MySQL中幻像读取。我知道在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:

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

我有他们在阵列B/C我使用的Statement.execute()方法来执行每一行,我有autocommit设置为false。

为什么querySetOne [1]和querySetOne [3]的查询在可重复读取隔离级别下返回相同的结果?

+0

阅读此问题:[如何生成幻读?](http://stackoverflow.com/questions/5444915/how-to-produce-phantom-reads) – 2012-03-23 00:56:23

回答

0

对于REPEATABLE READ,模型是不可能的。幻影是READ COMMITTED的结果。这是RR和RC之间的主要区别。我最近写了一篇博客文章,解释了两个隔离级别,因为他们经常感到困惑:http://blog.9minutesnooze.com/repeatable-read-read-committed/

+0

好吧,我已经切换了数据库引擎到MyISAM。现在所有的隔离级别都可以(并且确实)产生一个幻影...为什么在MyISAM中SERIALIZABLE隔离级别生成幻影,不应该在第一次完成之前阻止第二个事务? – user1251858 2012-03-23 15:28:54

+0

MyISAM不是一个事务性存储引擎,所以可重复读/读COMMITTED/etc不起作用。在默认情况下,MySQL提供的引擎必须使用InnoDB。 – 2012-03-25 15:01:28

3

SQL标准似乎表明幻像读取可能在可重复读取隔离中,但并不要求它们是必需的。

特别是,MySQL的InnoDB引擎在可重复读取隔离下支持consistent reads,这意味着事务中的第一次读取会创建快照,稍后在事务中再次读取时会使用相同的快照。

MySQL documentation说,这大约可重复读隔离:

在同一事务内所有持续读读取由第一次读建立快照。这个约定意味着如果你在同一个事务中发出了几个纯的(非锁定的)SELECT语句,这些SELECT语句也是相互一致的。

相关问题