InnoDB的RR隔离级别下能解决幻读吗

经常看到网上有人争论,或者面试被问到,MySQL 的 RR 事务隔离级别 能解决 “幻读” 问题吗?

结论是:能解决。但并不完美,需要人为地加锁。

Innodb 的方法是行锁加间隙锁,应用 next-key lock 算法。

行锁即更新处加上 for update,这样在更新语句的 范围条件,例如 id > 100 的范围内就不能再插入或更新了,也就解决了幻读的问题。

之所以说不完美,是因为在 RR 级别下,事务内如果执行了更新语句且更新的是范围锁内的行,那么这个更新语句会使用 “当前读” 的策略,这种情况下会使间隙锁失效。从而可以造成其他事务的变更操作导致的幻读产生。 需要主动在更新处加上 for updatelock in share mode 这样的锁声明来防止其他事务对某个范围内的行进行更新的情形。所以 InnoDB RR 不是天然支持幻读级别,但仍能解决大部分幻读问题。

简单模拟下场景

// todo-demo

参考文章: https://blog.csdn.net/DILIGENT203/article/details/100751755?depth_1-tdsourcetag=s_pctim_aiomsg https://blog.csdn.net/weixin_42907817/article/details/107121470