我试图演示通过使用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]的查询返回相同的结果?

最佳答案

SQL标准似乎表明幻像读取可以以可重复的读取隔离方式进行,但没有说明它们是必需的。

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

MySQL documentation表示有关可重复读取隔离:

10-04 17:39