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

Cia*_*her 10 sql-server-2000 database-tuning locking nolock

我们运行 SQL Server 2000,每天晚上都会遇到一些这样的错误。

Could not continue scan with NOLOCK due to data movement
Run Code Online (Sandbox Code Playgroud)

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

文化“最佳实践”是,在过去,NOLOCK提示的引入提高了性能并改进了并发性。这个查询不需要 100% 准确,即我们会容忍脏读等。然而,我们正在努力理解为什么数据库会抛出这个错误,即使我们有所有这些锁定提示。

任何人都可以对此有所了解 - 温柔一点,我实际上是一名程序员,而不是 DBA :)

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

Sim*_*rts 7

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

克雷格弗里德曼在这里写得很好

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

如果这不起作用,您有一个稍微痛苦的选择,即删除所有WITH (NOLOCK)提示并将您的事务隔离级别设置为高于READ UNCOMMITTED