https://www.cnblogs.com/qdhxhz/p/15560986.html

幻读,并不是说两次读取获取的结果集不同,幻读侧重的方面是某一次 select 操作得到的结果所表征的数据状态无法支撑后续的业务操作。

更为具体一些:select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在,无法插入,此时就发生了幻读。

幻读错误的理解

说幻读是 事务A 执行两次 select 操作得到不同的数据集,即 select 1 得到 10 条记录,select 2 得到 15 条记录。
这其实并不是幻读,既然第一次和第二次读取的不一致,那不还是不可重复读吗,所以这是不可重复读的一种。

正确的理解应该是


幻读,并不是说两次读取获取的结果集不同,幻读侧重的方面是某一次 select 操作得到的结果所表征的数据状态无法支撑后续的业务操作。

更为具体一些:select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在,无法插入,此时就发生了幻读。

假设有张用户表,这张表的 id 是主键。表中一开始有4条数据。

Untitled

我们再来看下出现 幻读 的场景

Untitled

这里是在RR级别下研究(可重复读),因为 RU / RC 下还会存在脏读、不可重复读,故我们就以 RR 级别来研究 幻读,排除其他干扰。