脏读:单个查询中的结果不同?

时间:2016-06-07 15:46:02

标签: sql-server

在SQL Server 2014中,当我发出以下SQL时:

SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED

SELECT * FROM TableA
UNION ALL
SELECT * FROM TableB
WHERE NOT EXISTS (
    SELECT 1 FROM TableA WHERE TableA.ID = TableB.ID
) 

是否有可能在一个Statement中读取一个表的不同版本,因为脏读?

示例:在联合的第一部分中从TableA读取2行,但在联合的第二部分的内部选择中从TableA读取1行,因为一行被另一个事务删除同时

2 个答案:

答案 0 :(得分:1)

对我来说,这该死的可能。

查询执行计划如下所示: Execution plan example

看起来TableA会有两个不同的读取,所以它实际上取决于它们之间的时间延迟和对这些表的CRUD操作量。

READ UNCOMMITTED对于这样的查询来说真的不是那么好的选择。

答案 1 :(得分:1)

简答:是的,取决于生成的执行计划。你在一个声明中做这件事并不重要;没有特殊权限与语句边界相关联。 READ UNCOMMITTED表示由于任何原因没有锁定数据,这正是您将获得的。这也是为什么一般不推荐使用它的原因;得到不一致/“不可能”的结果非常容易。哎呀,即使是一个SELECT也不安全:你甚至不能保证不会跳过或重复行!