我在本站看到一位大佬的文章
这里面有这样的一段话
幻读错误的理解:
说幻读是 事务A 执行两次 select 操作得到不同的数据集,即 select 1 得到 10 条记录,select 2 得到 11 条记录。这其实并不是幻读,这是不可重复读的一种,只会在 R-U R-C 级别下出现,而在 mysql 默认的 RR 隔离级别是不会出现的。
幻读:
并不是说两次读取获取的结果集不同,幻读侧重的方面是某一次的 select 操作得到的结果所表征的数据状态无法支撑后续的业务操作。更为具体一些:select 某记录是否存在,不存在,准备插入此记录,但执行 insert 时发现此记录已存在,无法插入,此时就发生了幻读。
可能看他的全文比较好。
我觉的他这个说法我是比较赞同的,我也认为两次select结果不同属于不可重复读的一种。但是我在B站看视频学习和在网上看到的说法都是两次select数据条数不同就是幻读,那么幻读到底是什么定义呢?
维基百科是这样解释的:
可以看下官方文档 “幻行” 的说明 https://dev.mysql.com/doc/refman/8.0/en/innodb-next-key-locking.html
官方说道,if a SELECT
is executed twice, but returns a row the second time that was not returned the first time, the row is a “phantom” row
如果一个select执行了2次,但是返回了第一次select中未返回的数据行,称这个数据行为“幻行”;
我理解出现“幻行” 的这个 select 操作 称之为 “幻读”。