试图在REPEATABLE-READ隔离级别下在MySQL中创建一个幻像

时间:2012-03-23 00:42:32

标签: java mysql jdbc

我试图通过使用JDBC来演示MySQL中的幻像读取。我知道在REPEATABLE-READ隔离级别下,幻像应该是可能的。但我不能让一个人发生。我的交易设置如下:

交易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]的查询在可重复读取隔离级别下返回相同的结果?

2 个答案:

答案 0 :(得分:4)

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

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

MySQL documentation说这是关于可重复读取隔离的:

  

同一事务中的所有一致读取读取第一次读取建立的快照。此约定意味着如果在同一事务中发出多个普通(非锁定)SELECT语句,则这些SELECT语句也相互一致。

答案 1 :(得分:0)

使用REPEATABLE READ无法使用幻像。幽灵是READ COMMITTED的结果。这是RR和RC之间的主要区别。我最近写了一篇博客文章,解释了两个隔离级别,因为它们经常混淆:http://blog.9minutesnooze.com/repeatable-read-read-committed/