Ich erhalte gelegentlich die Meldung "Der Scan konnte NOLOCK
aufgrund von Datenverschiebungen nicht fortgesetzt werden " bei einigen großen Jobs, die WITH (NOLOCK)
in den ausgewählten Abfragen enthalten sind.
Ich verstehe, dass dies etwas mit dem Versuch zu tun hat, Daten auszuwählen, wenn ein Seitenteil aufgeteilt wurde, der dazu führte, dass die Daten nicht mehr dort waren, wo sie sein sollten - ich gehe davon aus, dass dies in meiner Umgebung geschieht.
Wie würde ich das reproduzieren?
Ich versuche, eine kurzfristige Problemumgehung durchzuführen, um den Fehler abzufangen und es in diesem Fall erneut zu versuchen, aber ich kann ihn nicht testen, wenn ich ihn nicht reproduzieren kann. Gibt es einen einigermaßen zuverlässigen Weg, dies zu verursachen?
In diesem Fall führt die erneute Ausführung der Abfrage zum Erfolg. Daher habe ich keine Bedenken, dass die tatsächlichen Daten oder Datenbanken dauerhaft beschädigt sind. Einige der Tabellen in der Abfrage (zusammen mit ihren Indizes) werden häufig gelöscht, neu erstellt und neu gefüllt, daher gehe ich davon aus, dass dies etwas damit zu tun hat.
Das Entfernen NOLOCK
ist mein langfristiges Problem. Der Grund dafür NOLOCK
war in erster Linie, dass die Abfragen so schlecht sind, dass sie bei alltäglichen Transaktionen NOLOCK
zum Stillstand kamen , ebenso wie ein Pflaster, um die Deadlocks zu stoppen (was funktionierte). Ich brauche also ein Pflaster für ein Pflaster, bis wir eine dauerhafte Lösung finden können.
Wenn ich es mit einer Hello World reproduzieren könnte, würde ich wahrscheinlich planen, das Pflaster in weniger als einer Stunde in den Job zu stecken. Das Entfernen und Ersetzen kann nicht durchgeführt werden NOLOCK
, da ich wieder Deadlocks für die App bekomme, die für mich schlimmer sind als ein gelegentlich fehlgeschlagener Job.
Die Isolierung von gelesenen festgeschriebenen Snapshots ist eine gute Möglichkeit. Ich muss mit unserem Datenbankteam zusammenarbeiten, um weitere Details dazu zu erhalten. Ein Teil unseres Problems ist, dass wir keinen SQL Server-Experten haben, der sich mit solchen Dingen befasst, und ich verstehe die Isolationsstufen nicht gut genug, um diese Änderung derzeit vorzunehmen.
DEADLOCK_PRIORITY
auf LOW
in den Jobs, so dass , wenn es Deadlocks sind, werden die Aufträge fehlschlagen, und nicht die Anwendungen. Danach können Sie die Deadlocks untersuchen, herausfinden, warum sie auftreten, und dieses Problem beheben. Es könnte eine sehr einfache Lösung sein, wie das Vertauschen der Reihenfolge zweier Anweisungen. Was auch immer das Problem ist, es NOLOCK
ist nicht die Lösung . Hören Sie also auf, es zu erzwingen, nur weil es am einfachsten ist.
NOLOCK
diese Jobs einfach zu entfernen ? 601 sollte Ihre geringste Sorge sein, wenn die Ergebnisse dieser Abfragen korrekt sein sollen . Paul White zeigt ein besonders abschreckendes Beispiel Daten zu lesen , die nicht möglich sein soll , hier .