阻塞在IsolationLevel.ReadUncommitted中发生隔离级别?

时间:2014-02-19 08:12:57

标签: sql sql-server sql-server-2012

我的相同查询有时需要几毫秒,有些时间需要超过90秒。从我的申请中,我正在设置IsolationLevel = ReadUncommitted。这是导致问题的我的SP,

UPDATE  MyTable
    SET [Action] = ISNULL(TP.[Action], T.[Action]) -- If TP.[Action] is null take the old value
        ,[ErrorDescription] = ISNULL(TP.[ErrorDescription], T.[ErrorDescription])
        ,[ID] = ISNULL(TP.[ID], T.ID)
FROM    MyTable T
        CROSS APPLY MyUdf(....)  AS TP
WHERE   .......;

此SP正在调用UDF,这是UDF导致问题的行,

IF(EXISTS(SELECT TOP 1 1 FROM MyTable  WHERE ..............))
BEGIN
    --.......................
END

现在从SQL Server所有阻止事务报告中,我看到了这两个语句。这两行也很昂贵(根据查询)

请注意,UDF和SP都使用相同的表(MyTable)。我不明白为什么这个SELECT会阻塞,因为连接是IsolationLevel = ReadUncommitted

1 个答案:

答案 0 :(得分:1)

  

我看到这两个陈述。这两行也很昂贵(根据查询)

您应该发布您的实际观察结果,而不是您的解释。发布您运行的实际查询以及您获得的实际结果。

您应该使用快照隔离来避免阻塞,而不是脏读。 Dirty reads are inconsistent reads您将得到错误的结果。

至于为什么脏读取阻塞,可能有几个原因。首先,您没有发布实际代码提交查询的方式,您没有证明SELECT 是脏的。您很可能正在读取已提交读取和普通数据阻止。但即使你真的脏读,脏读也会阻塞架构稳定性块。任何类型的活动都会阻碍数据/日志增长事件的发生。