由于数据移动,无法继续使用NOLOCK进行扫描


10

我们运行SQL Server 2000,并且每晚都有一些此类错误。

Could not continue scan with NOLOCK due to data movement

引发此错误的查询是一个大型的复杂查询,连接了十几个表。我们的基础数据可以经常更新。

文化上的“最佳实践”是,过去,引入NOLOCK提示可以提高性能并提高并发性。该查询不必是100%准确的,即我们可以忍受脏读等。但是,尽管我们拥有所有这些锁定提示,但我们仍在努力理解为什么数据库抛出此错误。

任何人都可以对此有所了解-彬彬有礼,我实际上是程序员,而不是DBA :)

PS:我们已经应用了下面提到的修复程序:http : //support.microsoft.com/kb/815008


3
我将放下NOLOCK并修复查询/索引/过程。我们当然可以提供帮助...另请参见en.wikipedia.org/wiki/Halloween_Problem
gbn

3
@SQLKiwi:SQL 2012在脏扫描下的许多数据移动情况下都能正常恢复(按分配顺序在下一页继续)。
Remus Rusanu 2012年

1
@SQLKiwi:是的,仍然存在。好消息是:脏扫描支持的光标也应该更优雅地处理。
Remus Rusanu 2012年

Answers:


7

这是SQL Server 2000的一个众所周知的问题-本质上,发生的情况是,如果在进程B进行扫描时(在READ UNCOMMITTEDWITH (NOLOCK)),进程A删除了一行,那么进程B会“呵呵,此数据发生了什么”,当它尝试阅读它时。更准确地说,必须在进程B读取索引之后但在尝试读取数据行之前删除该行。

克雷格·弗里德曼(Craig Freedman)在这里写得很好

幸运的是,修复相对简单:http : //support.microsoft.com/kb/815008

如果这不起作用,则您可以选择删除所有WITH (NOLOCK)提示并将事务隔离级别设置为之上,这是比较痛苦的选择READ UNCOMMITTED


我们是最新的修复程序-我们应用了该标志,然后重新启动,但仍然收到这些错误。
Ciaran Archer
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.