mysql - 为什么称为幻影查询?

标签 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条记录。

看到这在我看来很正常。我不明白为什么它们被称为“幻读”。所有交易都在不同的时间发生,所以我们总是得到最新的数据。最初有 2 条记录,后来插入了 1 条记录..所以当我们再次运行 Query 时,我们得到更新的数据,即 3 条记录。那么为什么它被称为幻影查询。?

最佳答案

在纯粹的学术层面上,交易应该看到基于交易开始时的数据的数据库的一致状态。它应该只能看到自己的变化,而不能看到其他任何东西。

只要事务 1 没有完成查看提交的数据,就被认为是幻读,因为它看到事务开始时不存在的行。

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

有时你想要幻读然后你使用READ COMMITTED隔离级别(这是大多数DBMS的默认设置),有时你不想要它们 - 然后你使用SERIALIZABLE 隔离级别

关于mysql - 为什么称为幻影查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7820573/

相关文章:

PHP 电子邮件应用程序

php - 右 JOIN 与选择结果

mysql - SQL group by subselect

sql-server - 在 SQL Server 中,过滤一整天的项目的最佳方法是什么

mysql - SQL SUM 计数大小写

mysql - 找出 SQL 中的 AVG 列

sql - 如何连接多个表?

sql - 如何在 SQL Server 中多次检索行?

mysql - 向表中添加或删除列会强制重新创建所有索引吗?

php - 在单个 codeigniter 应用程序中连接多个服务器