在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行,因为一行被另一个事务删除同时
答案 0 :(得分:1)
对我来说,这该死的可能。
看起来TableA会有两个不同的读取,所以它实际上取决于它们之间的时间延迟和对这些表的CRUD操作量。
READ UNCOMMITTED对于这样的查询来说真的不是那么好的选择。
答案 1 :(得分:1)
简答:是的,取决于生成的执行计划。你在一个声明中做这件事并不重要;没有特殊权限与语句边界相关联。 READ UNCOMMITTED
表示由于任何原因没有锁定数据,这正是您将获得的。这也是为什么一般不推荐使用它的原因;得到不一致/“不可能”的结果非常容易。哎呀,即使是一个SELECT
也不安全:你甚至不能保证不会跳过或重复行!