SELECT WITH(NOLOCK)有时不返回结果

时间:2018-11-19 16:01:31

标签: sql sql-server nolock

以下查询通常返回大量结果(大约750k个结果)。但是,在生产中,我偶尔会遇到返回0个结果的情况。如果我们在返回0后的第二秒重新运行它,它将只返回正常结果。

我确定数据仍然存在,并且不应该有任何东西将其删除...

我在几个地方看过一遍,无法找到导致上述问题的原因...而且,似乎没有简单的方法可以复制它...这只是随机的。

由于我的SQL知识非常有限,请您考虑一下可能发生这种情况的某些情况?还是建议调试此方法的简便方法?

SELECT MAX(Table1.Cust_ID) AS cust_id, Table1.Email, MAX(Table1.Cust_Name) as cust_name
FROM dbo.Table1 WITH (NOLOCK)
INNER JOIN dbo.Table2 WITH (NOLOCK)
  ON Table1.id = Table2.id
  WHERE Table1.some_id = 100 AND Table1.some_value = 'test_value'
  AND  Table1.some_boolean_1 = 1
  AND  Table1.some_date_1 IS NULL
  AND (Table1.some_boolean_2 IS NULL OR Table1.some_boolean_2 = 1)
  AND (Table1.some_date_2 > '20171119' OR Table1.some_date_3 > '20171119' OR 
       Table2.some_date_3 > '20171119')
GROUP BY Table1.Email

非常感谢!

1 个答案:

答案 0 :(得分:-2)

WITH(NOLOCK)提示使SQL Server以非事务方式执行查询,这意味着数据完整性将被忽略,并且结果可以是任何中间状态。与将事务隔离级别设置为READ UNCOMMITTED相同,但仅对此查询有效。结果还可以包括已插入但尚未提交的行,以及除事务外正在运行的所有行。不确定是什么原因导致空结果,但是当同时运行修改时,它可能返回奇怪的结果。