起初我以为我应该去看看我的博士并对我的大脑进行核磁共振检查。但是,我看到的结果得到了第二个程序员的证实。运行完全相同的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
表创建摘要记录,总是返回类似查询中的记录...这就是为什么我必须查看详细程序/报告。
思想?
答案 0 :(得分:8)
NOLOCK
表示您不关心一致性,并发性和锁定/阻塞。它允许您读取同一行0次,1次或2次。对于查询而言,这不是一个神奇的“更快”按钮:如果您完全了解繁忙系统的潜在后果(例如在不同时间获得不同结果,则应该使用它)。
解决方案是:
停止盲目地将NOLOCK
扔到任何地方(接受阻止以获取准确一致的数据,或使用读提交的快照隔离)。
接受NOLOCK
牺牲准确性以减少阻塞,有时它不会给出正确的结果。如果你要求这样做,你就不会抱怨它。