我很困惑为什么它被称为幻影查询..例如假设这3个查询: -
查询1
SELECT * FROM users
WHERE salary BETWEEN 10000 AND 300000;
返回2条记录。
查询2
INSERT INTO users VALUES ( 3, 'Bob', 270000 );
COMMIT;
再次查询1
SELECT * FROM users
WHERE salary BETWEEN 10000 AND 30000;
返回3条记录。
看来我觉得很正常。我不明白为什么他们被称为'幻影阅读'。所有交易都发生在不同的时间,所以我们总是得到最新的数据。最初有2条记录,后来插入了1条记录..所以当我们再次运行查询时,我们得到更新的数据,即3条记录。那么为什么它被称为幻影查询。?
答案 0 :(得分:3)
在纯粹的学术级别上,事务应该根据事务开始时的数据看到数据库的一致状态。它应该只看到自己的变化,而不是别的。
只要事务1尚未完成,就会将已提交的数据视为幻像读取,因为它会在事务开始时看到不存在的行。
由于并不总是需要这种强有力的学术方法,因此引入了不同的隔离级别。根据要求,开发人员可以根据实施的业务规则选择所需的级别。
有时你想要幻像读取然后你使用READ COMMITTED
隔离级别(这是大多数DBMS的默认值),有时你不需要它们 - 然后你使用SERIALIZABLE
隔离级别
答案 1 :(得分:1)
如果未在事务上设置范围锁定,则会发生幻像读取。这里会发生什么是你写的 - 第一次选择将返回2行,而第二次选择将返回3行 按定义读取的幻像意味着执行两个相同的查询,第二个查询返回的行集合与第一个不同。如果应用了正确的隔离,则应同时返回相同的行集。