Executamos o SQL Server 2000 e obtemos alguns desses erros todas as noites.
Could not continue scan with NOLOCK due to data movement
A consulta que gera esse erro é uma consulta complexa grande que une mais de uma dúzia de tabelas. Nossos dados subjacentes podem ser atualizados com freqüência.
A 'melhor prática' cultural é que, no passado, a introdução de NOLOCK
dicas aumentava o desempenho e melhorava a simultaneidade. Essa consulta não precisa ser 100% precisa, ou seja, toleraremos leituras sujas etc. No entanto, estamos lutando para entender por que o banco de dados está lançando esse erro, mesmo que tenhamos todas essas dicas de bloqueio.
Alguém pode lançar alguma luz sobre isso - seja gentil, sou na verdade um programador, não um DBA :)
PS: aplicamos a correção mencionada abaixo anteriormente: http://support.microsoft.com/kb/815008
fonte
Respostas:
Esse é um problema razoavelmente conhecido no SQL Server 2000 - essencialmente, o que acontece é que uma linha é excluída pelo processo A enquanto o processo B está fazendo uma verificação (no
READ UNCOMMITTED
ouWITH (NOLOCK)
), então o processo B fica "huh, o que aconteceu com esses dados "quando tenta ler. Mais precisamente, a linha deve ser excluída após o processo B ler o índice, mas antes de tentar ler a linha de dados.Craig Freedman escreve bem aqui
Felizmente, a correção é relativamente simples: http://support.microsoft.com/kb/815008
Se isso não funcionar, você tem a opção um pouco mais dolorosa de remover todas as suas
WITH (NOLOCK)
dicas e definir o nível de isolamento da transação para algo acimaREAD UNCOMMITTED
.fonte