WITH(NOLOCK)给出不同的结果

时间:2013-11-13 20:59:22

标签: sql-server

起初我以为我应该去看看我的博士并对我的大脑进行核磁共振检查。但是,我看到的结果得到了第二个程序员的证实。运行完全相同的SQL会在不同时间给出不同的结果!这没有道理。这是我正在运行的(更改表名以保护无辜者)......

declare @customerid int;
declare @locationid int;
declare @reportdate datetime;
set @customerid=2063;
set @locationid=101;
set @reportdate=getdate();

select i.InvoiceDate as [Date], ... from Invoice i (nolock) ...
UNION ALL select ... from Remit e (nolock) ...
UNION ALL select ... from [Rec] r (nolock) join TrTypes t (nolock) on ...

两个select / union all是相同的,但有时第二个不会在第一个显示时从Remit表返回记录。并且...有时第一个也不会拉它们。我将这些查询放在SQL Server Management Studio中并继续点击F5 ...有时我会得到正确的结果,有时候我没有。

此外,当我删除UNION ALL并运行查询时,Remit会返回

这可能是锁定问题吗?

此查询来自生成详细报告的C#程序,从不返回“汇款”记录。还有另一个程序从Remit表创建摘要记录,总是返回类似查询中的记录...这就是为什么我必须查看详细程序/报告。

思想?

1 个答案:

答案 0 :(得分:8)

NOLOCK表示您不关心一致性,并发性和锁定/阻塞。它允许您读取同一行0次,1次或2次。对于查询而言,这不是一个神奇的“更快”按钮:如果您完全了解繁忙系统的潜在后果(例如在不同时间获得不同结果,则应该使用它)。

解决方案是:

  1. 停止盲目地将NOLOCK扔到任何地方(接受阻止以获取准确一致的数据,或使用读提交的快照隔离)。

  2. 接受NOLOCK牺牲准确性以减少阻塞,有时它不会给出正确的结果。如果你要求这样做,你就不会抱怨它。