Mysql REPEATABLE-READ 可重复读事务隔离级别下的 幻读问题实践验证

我们知道在RR可重复读事务隔离级别下,是存在幻读问题的。但是在网上看到有一种说法是在Mysql的RR事务隔离级别下,mysql通过MVCC(多版本并发控制)解决了幻读问题的。所以就查了下资料,决定通过实践来验证一下这个问题。

实践是检验真理的唯一标准!这里先说结论:Mysql在可重复读事务隔离级别下,是存在幻读问题的。

验证过程:

  • 先查看下当前数据库的事务隔离级别,确认为REPEATABLE-READ级别。

Mysql REPEATABLE-READ 可重复读事务隔离级别下的 幻读问题实践验证_第1张图片

  • 创建测试表
CREATE TABLE `test` (
  `id` int(8) NOT NULL AUTO_INCREMENT,
  `NAME` varchar(16) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • 打开两个连接窗口,开启两个事务进行测试

我们先插入一条数据: insert test(name) values('aaa');

场景1:

事务1先执行一次查询,返回1条数据;

然后开启事务2,执行 insert test(name) values('aaa'); commit 提交事务2;

事务1再次查询,是查询不到事务2新增的数据的。

结论:该场景下没有产生幻读。

Mysql REPEATABLE-READ 可重复读事务隔离级别下的 幻读问题实践验证_第2张图片

 

场景2:

​接场景1(上图),在事务1中执行

update test set name='ccc' where name='aaa';

奇怪的情况出现了,可以看到前面查询时表里只有一条数据,但是执行update时却更新了两条数据,再次查询,查询到两条数据。

结论:该场景下出现幻读。

Mysql REPEATABLE-READ 可重复读事务隔离级别下的 幻读问题实践验证_第3张图片

 

总结:

场景1 insert的场景下,mysql通过MVCC的方式进行快照读,实现读已提交和可重复读。不会出现幻读情况。

但是在场景2 update的场景下,是会出现幻读的。

 

参考:

https://www.jianshu.com/p/cef49aeff36b

 

你可能感兴趣的:(数据库)