Mysql 为什么它被称为幻影查询?

Mysql 为什么它被称为幻影查询?,mysql,sql,sql-server,post,Mysql,Sql,Sql Server,Post,我不明白为什么它被称为幻影查询。。例如,假设这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条记录 我觉得这很正常。我不明白为什么它们

我不明白为什么它被称为幻影查询。。例如,假设这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条记录。那么为什么它被称为幻影查询呢?

在纯学术级别上,事务应该根据事务启动时的数据看到数据库的一致状态。它应该只看到自己的变化,而不看到其他变化

只要事务1尚未完成查看,提交的数据就被视为幻象读取,因为它看到的行在事务启动时不存在

由于并不总是需要这种强有力的学术方法,因此引入了不同的隔离级别。根据需求,开发人员可以根据实现的业务规则选择所需的级别


有时需要幻影读取,然后使用读取提交隔离级别,这是大多数DBMS的默认值,有时不需要-然后在纯学术级别上使用可序列化隔离级别事务启动时应根据数据查看数据库的一致状态。它应该只看到自己的变化,而不看到其他变化

只要事务1尚未完成查看,提交的数据就被视为幻象读取,因为它看到的行在事务启动时不存在

由于并不总是需要这种强有力的学术方法,因此引入了不同的隔离级别。根据需求,开发人员可以根据实现的业务规则选择所需的级别


有时需要幻像读取,然后使用读取提交隔离级别,这是大多数DBMS的默认值,有时不需要,然后使用可序列化隔离级别,如果事务上没有很好地设置范围锁,则会发生幻像读取。这里发生的事情正是您编写的-第一次选择将返回2行,而第二次选择将返回3行。
幻象按定义读取意味着执行两个相同的查询,第二个查询返回的行集合与第一个查询不同。如果应用了正确的隔离,则两次都应返回相同的行集。

如果事务上没有正确设置范围锁,则会发生幻象读取。这里发生的事情正是您编写的-第一次选择将返回2行,而第二次选择将返回3行。
幻象按定义读取意味着执行两个相同的查询,第二个查询返回的行集合与第一个查询不同。如果应用了正确的隔离,则两次都应返回相同的行集。

如果它们发生在3个单独的事务中,则它不是幻影。当同一事务多次执行范围查询,并且在两个查询之间插入了一个幻像行时,就会出现幻像问题。如果它们发生在3个单独的事务中,则它不是幻像。当同一事务多次执行范围查询,并且在两个查询之间插入了一个幻影行时,就会出现幻影问题。您需要可序列化不可重复读取来防止幻影。您是对的。我混淆了不可重复读取和幻影读取。您需要可序列化不可重复读取来防止幻影。您是对的。我混淆了不可重复读取和幻象读取。