Vermeiden von Deadlock mit NOLOCK Hinweis

8

Hin und wieder erhalte ich einen Fehler in der Produktionsumgebung, der bei der gleichen gespeicherten Prozedur wieder verschwindet.

  

Transaktion (Prozess-ID 86) wurde bei Sperrressourcen mit einem anderen Prozess blockiert und wurde als Deadlock-Opfer ausgewählt. Führen Sie die Transaktion erneut aus

Jemand hat mir gesagt, dass wenn ich den NOLOCK-Hinweis in meinen gespeicherten Prozeduren verwende, es sicherstellen wird, dass es niemals blockiert wird. Ist das richtig? Gibt es bessere Möglichkeiten, diesen Fehler zu behandeln?

    
Silverlight Student 08.07.2011, 19:48
quelle

3 Antworten

5

Gelegentliche Deadlocks in einem RDBMS, das wie SQL Server / Sybase gesperrt wird, werden erwartet.

Sie können auf dem Client so programmieren, dass er wie empfohlen meine MSDN "Umgang mit Deadlocks" wiederholt. Im Grunde untersuchen Sie die SQLException und versuchen Sie es vielleicht eine halbe Sekunde später erneut.

Andernfalls sollten Sie Ihren Code überprüfen, damit der gesamte Zugriff auf Tabellen in der gleichen Reihenfolge erfolgt. Oder Sie können mit SET DEADLOCK_PRIORITY steuern, wer zum Opfer wird.

Auf MSDN für SQL Server gibt es "Minimieren von Deadlocks" , das beginnt

  

Obwohl Deadlocks nicht vollständig vermieden werden können

Dies erwähnt auch "Verwenden Sie eine niedrigere Isolation Level", die ich nicht mag (wie viele SQL-Typen hier auf SO) und ist Ihre Frage. Tun Sie es nicht ist die Antwort ...: -)

Hinweis: MVCC Typ RDBMS (Oracle, Postgres) haben dieses Problem nicht. Siehe Ссылка , aber MVCC hat andere Probleme.

    
gbn 08.07.2011, 20:32
quelle
3

Während das Hinzufügen von NOLOCK verhindern kann, dass Leser und Schreiber sich gegenseitig blockieren (abgesehen von all den negativen Nebenwirkungen, die es hat), ist es keine magische Lösung für Deadlocks. Viele Deadlocks haben überhaupt nichts mit dem Lesen von Daten zu tun, daher kann die Anwendung von NOLOCK auf Ihre Leseabfragen nichts ändern. Haben Sie eine Ablaufverfolgung ausgeführt und das Deadlock-Diagramm untersucht, um genau zu sehen, was der Deadlock ist? Dadurch sollten Sie zumindest wissen, welchen Teil des Codes Sie sich ansehen sollten. Zum Beispiel, ist die gespeicherte Prozedur Deadlocking, weil sie von mehreren Benutzern gleichzeitig aufgerufen wird, oder blockiert sie mit einem anderen Code?

    
Aaron Bertrand 08.07.2011 20:00
quelle
0

Hier finden Sie einen guten Link zum Erlernen der Behebung von Deadlocks . Ich versuche immer, nolock aus den oben genannten Gründen zu vermeiden. Vielleicht möchten Sie auch Lock Compatibility besser verstehen.

    
null_pointer 11.07.2011 02:33
quelle

Tags und Links