Wir führen SQL Server 2000 aus und erhalten jede Nacht einige dieser Fehler.
Could not continue scan with NOLOCK due to data movement
Die Abfrage, die diesen Fehler auslöst, ist eine große komplexe Abfrage, die über ein Dutzend Tabellen verknüpft. Unsere zugrunde liegenden Daten können häufig aktualisiert werden.
Die kulturelle „Best Practice“ besteht darin, dass in der Vergangenheit durch die Einführung von NOLOCK
Hinweisen die Leistung gesteigert und die Parallelität verbessert wurde. Diese Abfrage muss nicht 100% genau sein, dh wir tolerieren Dirty Reads usw. Wir haben jedoch Schwierigkeiten zu verstehen, warum die Datenbank diesen Fehler auslöst, obwohl wir alle diese Sperrhinweise haben.
Kann jemand etwas Licht ins Dunkel bringen - sei sanft, ich bin eigentlich ein Programmierer, kein DBA :)
PS: Wir haben den unten genannten Fix angewendet: http://support.microsoft.com/kb/815008
quelle
Antworten:
Dies ist ein ziemlich bekanntes Problem mit SQL Server 2000 - im Wesentlichen passiert, wenn eine Zeile von Prozess A gelöscht wird, während Prozess B einen Scan durchführt (entweder bei
READ UNCOMMITTED
oderWITH (NOLOCK)
), dann geht Prozess B "huh, was mit diesen Daten passiert ist "wenn es versucht, es zu lesen. Genauer gesagt muss die Zeile gelöscht werden, nachdem Prozess B den Index gelesen hat, aber bevor er versucht, die Datenzeile zu lesen.Craig Freedman gibt hier einen guten Bericht
Glücklicherweise ist das Update relativ einfach: http://support.microsoft.com/kb/815008
Wenn dies nicht funktioniert, haben Sie die etwas schmerzhaftere Möglichkeit, alle Ihre
WITH (NOLOCK)
Hinweise zu entfernen und die Transaktionsisolationsstufe auf einen höheren Wert zu setzenREAD UNCOMMITTED
.quelle