我偶尔会遇到NOLOCK
一些大型作业“确实由于数据移动而无法继续扫描”的情况,这些作业确实存在WITH (NOLOCK)
于选择查询中。
我知道这与尝试在发生页面拆分时选择数据有关,这导致数据不再位于应有的位置-我认为这就是我的环境中发生的事情。
我将如何重现?
我试图做一个短期的变通办法来捕获错误并在发生这种情况时重试,但是如果无法重现它,我将无法对其进行测试。是否有合理可靠的方法引起这种情况?
当发生这种情况时,再次执行查询会成功-因此,我对实际数据或数据库永久损坏没有任何担心。查询中的某些表(以及它们的索引)经常被删除,重新创建和重新填充,因此我假设它与此相关。
删除NOLOCK
是我要解决的长期问题。首先NOLOCK
放在这里的原因是,查询是如此糟糕,以至于它们陷入日常事务的僵局中,因此NOLOCK
,用于阻止僵局(工作正常)的创可贴也是如此。因此,在我们可以做一个永久性解决方案之前,我需要一个创可贴。
如果我可以用《 Hello World》来复制它,我计划在不到一个小时的时间内将创可贴打入工作。无法进行搜索和替换删除NOLOCK
,因为我将再次开始遇到应用死锁,这对我来说比偶尔的失败工作更糟糕。
使用读取提交的快照隔离是一种很好的可能性-我将不得不与我们的数据库团队合作以获取有关该快照的更多详细信息。问题的一部分是,我们没有SQL Server专家来处理此类问题,而且我对隔离级别的理解不充分,无法立即进行更改。
DEADLOCK_PRIORITY
为LOW
,这样,如果出现死锁,作业将失败,而不是应用程序。之后,您可以研究僵局并找出发生这种僵局的原因,并解决该问题。这可能是非常简单的修复,例如交换两个语句的顺序。不管问题是什么,NOLOCK
是不是解决办法,所以停止试图迫使它只是因为这是最容易的。
NOLOCK
从这些工作中撤职?如果这些查询的结果正确无误,则 601应该是您最少的担心。保罗怀特(Paul White)展示了一个特别可怕的例子,读取数据在这里不可能做到。