来自 MySQL 词汇表:
幻像:出现在查询结果集中但不在先前查询结果集中的行。例如,如果一个查询在一个事务中运行了两次,与此同时,另一个事务在插入新行或更新行以匹配查询的 WHERE 子句后提交。
粗体部分是否正确?如果我有
CREATE TABLE t1 (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`c1` varchar(45) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
并且隔离级别是REPEATABLE READ,我这样做
mysql> start transaction;
mysql> SELECT * FROM t1 WHERE c1 < 10;
+----+------+
| id | c1 |
+----+------+
| 1 | 4 |
+----+------+
mysql> SELECT * FROM t1 WHERE c1 < 10;
+----+------+
| id | c1 |
+----+------+
| 1 | 4 |
+----+------+
即使没有人执行任何 INSERT 而只是 UPDATE,我有时也会从后面的查询中得到不同的结果?我的 MySQL 版本是 5.7。
SQL 标准表明幻读仅与并发 INSERT 相关,尽管生成这个词有点令人困惑。来自 ISO/IEC 9075:1992,数据库语言 SQL-1992 年 7 月 30 日(第二次非正式审查草案):
P3(“幻影”):SQL 事务 T1 读取满足某些搜索条件的行集 N。然后 SQL 事务 T2 执行 SQL 语句,生成满足 SQL 事务 T1 使用的搜索条件的一个或多个行。如果 SQL 事务 T1 然后以相同的搜索条件重复初始读取,它将获得不同的行集合。