Wie kann ich beweisen, dass NOLOCK die Ursache für Deadlocking-Probleme ist?

8

Ich versuche nicht, eine Windows / Mac-Diskussion zu starten.

Persönlich brauche ich keine Überzeugung, die NOLOCKals reflexive Praxis keine gute Idee ist. Es scheint, wenn Sie entwickeln, sollte alles zielgerichtet und nicht reaktionär sein (/ amen)

Also ... der verantwortliche Programmierer besteht darauf, dass dies NOLOCKder richtige Weg ist. Empfohlen bei allen Ad-hoc-Abfragen und bei jeder Abfrage der Produktion. Ich habe nicht auf jeder Tabelle eine gespeicherte Prozedur ohne Nolock-Hinweise gesehen.

Ich möchte nicht der Typ sein, der hereinkommt und allen sagt, dass eine Grundüberzeugung falsch ist, ohne dass etwas dahinter steckt.

Es reicht möglicherweise nicht aus, nur die Kommentarsitzungen unter den verschiedenen Blog-Posts zu betrachten, um einen Link zu senden. Langjährige Überzeugungen usw. Einige Leute sind nicht davon überzeugt, dass es ein Problem ist. Siehe: Kommentarbereich unter jedem Nolock-Blog-Beitrag, den ich gelesen habe.

Derzeit ringen einige andere Datenbankadministratoren mit mysteriösen Deadlocks. Wie kann man feststellen, ob NOLOCKs die Quelle sind?

Es wurde vorgeschlagen, XML anhand von Traces usw. zu betrachten, aber dies wird nicht explizit angeben, dass die Deadlocks das Problem verursachen, oder? Ich habe noch nie so einfache Fehlermeldungen gesehen. ist das wahr?

Wie sonst könnten diese Deadlocks daran befestigt werden?

DDL-Anweisungen wie CREATEwären ein Hinweis. Gibt es eine Ausgabe, auf die ich verweisen könnte, oder Daten, die ich finden könnte, um meine Theorie zu bestätigen, bevor ich den Alarm auslöse?

Oder führe ich Ablaufverfolgungsflags oder erweiterte Ereignisse aus, um festzustellen, was ausgeführt wird, wenn Deadlocks auftreten, und um dann aus DDL-Anweisungen abzuleiten?

Wenn man sich die verschiedenen Möglichkeiten ansieht, wie Daten mit Nolock-Hinweisen durcheinander gebracht werden können, scheint es ein schwieriges Problem zu sein, sie genau zu bestimmen.

user238855
quelle

Antworten:

16

Der verantwortliche Architekt, der darauf besteht, NOLOCKist der richtige Weg. Empfohlen bei allen Ad-hoc-Abfragen und bei jeder Abfrage der Produktion. Ich habe nicht auf jedem Tisch einen Sproc ohne Nolock-Hinweise gesehen.

Tut mir leid das zu hören. Dies wird allgemein als Anti-Muster unter SQL Server-Experten angesehen, aber es gibt möglicherweise nichts, was Sie tun können, um die Fakten vor Ort zu ändern, wenn die Praxis wirklich tief verwurzelt ist und auf den aufrichtigen und tief verwurzelten Überzeugungen einer Person basiert .

Die Frage besagt, dass "das Senden eines Links möglicherweise nicht ausreicht", aber es ist unklar, was Sie stattdessen möchten. Wir könnten das überzeugendste Argument der Welt in einer Antwort hier schreiben, und Sie würden immer noch "einen Link senden". Letztendlich kann hier niemand wissen, welche Argumente in Ihrer spezifischen Situation erfolgreich sein werden (falls vorhanden).

Im Folgenden werden jedoch die meisten Punkte behandelt, die manche Menschen als überzeugend genug empfinden, um eine zuvor übliche Praxis zu ändern:

Trotzdem können Sie diesen Kampf möglicherweise nicht "gewinnen". Ich habe in einer Umgebung gearbeitet, die dies tat, die Risiken und Gründe verstanden, es nicht zu tun, aber trotzdem damit fortgefahren. Das waren kluge, logische Leute, aber am Ende war es eine Umgebung, in der ich nicht glücklich sein konnte, zu arbeiten.

Derzeit ringen einige andere Datenbankadministratoren mit mysteriösen Deadlocks. Wie bestimmt man, dass NOLOCKsdie Quelle sind.

Das üblichere Muster (in der Vergangenheit vielleicht häufiger), bei dem NOLOCKHinweise eingeführt werden, um das Auftreten von Deadlocks zu verringern . Dies kann insofern "funktionieren", als die Reduzierung der Anzahl der gemeinsam genutzten Sperren auf natürliche Weise die Wahrscheinlichkeit verringert, dass inkompatible Sperren verwendet werden. Dies ist jedoch keine gute Lösung für das zugrunde liegende Problem und enthält alle im vorherigen Abschnitt genannten Einschränkungen.

Dennoch NOLOCKHinweise können neue Wege vorstellen Deadlock. Die Verwendung der nicht festgeschriebenen Leseisolation kann eine vorübergehende Blockierungsbedingung (die behoben wird, wenn die konkurrierende Ressource verfügbar wird) in einen unlösbaren Deadlock (bei dem keiner der Kellner Fortschritte erzielen kann) entfernen, einfach weil der Konflikt jetzt an einem anderen Punkt stattfindet, z. B. bei Schreibvorgängen in einer anderen Reihenfolge Überlappung. Dave Ballantyne hat hier ein Beispiel:

Für allgemeinere Ratschläge zum Umgang mit Deadlocks empfehle ich Folgendes als Ausgangspunkt:

Sie sollten sich auch mit der Dokumentation vertraut machen:

Andere nützliche Ressourcen:

Paul White 9
quelle
5
"Trotzdem können Sie diesen Kampf möglicherweise nicht 'gewinnen'. Ich habe in einer Umgebung gearbeitet, die dies getan hat, die Risiken und Gründe verstanden, es nicht zu tun, aber trotzdem damit fortgefahren. Das waren kluge, logische Leute, aber Am Ende war es eine Umgebung, in der ich nicht glücklich sein konnte zu arbeiten. " Dies erwies sich als die richtige Antwort.
user238855