-2

起初我想我应该去看我的医生,对我的大脑进行核磁共振检查。但是,我看到的结果被第二个程序员证实了。运行相同的确切 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 ...

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

此外,当我删除UNION ALLs 并只运行查询时,不会Remit.

这可能是锁定问题吗?

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

想法?

4

1 回答 1

8

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

解决方案是:

  1. 不要盲目地NOLOCK到处乱扔(接受你的阻塞以获得准确和一致的数据,或者使用读取提交的快照隔离)。

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

于 2013-11-13T21:08:24.787 回答