Ursache dafür, dass ein Prozess ein Deadlock-Opfer ist


105

Ich habe einen Prozess mit einem Select, dessen Abschluss in der Größenordnung von 5 bis 10 Minuten lange dauert.
Ich verwende NOLOCK derzeit nicht als Hinweis auf das MS SQL-Datenbankmodul.
Gleichzeitig führt ein anderer Prozess Aktualisierungen und Einfügungen in dieselbe Datenbank und dieselben Tabellen durch.
Der erste Prozess wurde vor kurzem gestartet und endet vorzeitig mit einer Nachricht

SQLEXCEPTION: Die Transaktion wurde für Sperrressourcen mit einem anderen Prozess blockiert und als Deadlock-Opfer ausgewählt.

Dieser erste Prozess wird an anderen Standorten unter identischen Bedingungen ausgeführt, jedoch mit kleineren Datenbanken. Daher dauert die betreffende select-Anweisung viel kürzer (in der Größenordnung von etwa 30 Sekunden). Auf diesen anderen Websites wird die Deadlock-Nachricht auf diesen anderen Websites nicht angezeigt. Ich habe diese Nachricht auch nicht auf der Site erhalten, auf der das Problem anfänglich auftritt, aber ich gehe davon aus, dass ich mit dem Wachstum der Datenbank einen bestimmten Schwellenwert überschritten habe. Hier sind meine Fragen:

  1. Könnte die Zeit, die eine Transaktion benötigt, um ausgeführt zu werden, die Wahrscheinlichkeit erhöhen, dass der zugehörige Prozess als Deadlock-Opfer gekennzeichnet wird.
  2. Wenn ich die Auswahl mit einem NOLOCK-Hinweis ausführe, wird das Problem dadurch behoben?
  3. Ich vermute, dass ein Datum / Uhrzeit-Feld, das als Teil der WHERE-Klausel in der select-Anweisung überprüft wird, die langsame Suchzeit verursacht. Kann ich basierend auf diesem Feld einen Index erstellen? Ist es ratsam?

Teilantwort auf Punkt 1: Verwechseln Sie einen Deadlock nicht mit einer Zeitüberschreitung. Wenn Sie eine Zeitüberschreitung hatten, kann die Zeit, die für den Abschluss einer Transaktion benötigt wird, für die andere verantwortlich sein. Außerdem wäre es hilfreich zu wissen, für welche Ressource Sie einen Deadlock durchführen (handelt es sich um einen Index oder eine Tabelle?).
NealB

1
SET DEADLOCK_PRIORITY HIGH ALTER DATABASE Datenbankname SET MULTI_USER;
gstackoverflow

Antworten:


128

Frage 1: Könnte die Zeit, die für die Ausführung einer Transaktion benötigt wird, die Wahrscheinlichkeit erhöhen, dass der zugehörige Prozess als Deadlock-Opfer gekennzeichnet wird.

Nein. Das SELECT ist das Opfer, da es nur Daten gelesen hat. Daher sind mit der Transaktion geringere Kosten verbunden. Daher wird es als Opfer ausgewählt:

Standardmäßig wählt das Datenbankmodul als Deadlock-Opfer die Sitzung aus, in der die Transaktion ausgeführt wird , deren Rollback am kostengünstigsten ist . Alternativ kann ein Benutzer mithilfe der SET DEADLOCK_PRIORITYAnweisung die Priorität von Sitzungen in einer Deadlock-Situation angeben . DEADLOCK_PRIORITY kann auf LOW, NORMAL oder HIGH oder alternativ auf einen beliebigen ganzzahligen Wert im Bereich (-10 bis 10) gesetzt werden.

Q2. Wenn ich die Auswahl mit einem NOLOCK-Hinweis ausführe, wird das Problem dadurch behoben?

Aus mehreren Gründen:

Q3. Ich vermute, dass ein Datum / Uhrzeit-Feld, das als Teil der WHERE-Klausel in der select-Anweisung überprüft wird, die langsame Suchzeit verursacht. Kann ich basierend auf diesem Feld einen Index erstellen? Ist es ratsam?

Wahrscheinlich. Die Ursache für den Deadlock ist höchstwahrscheinlich eine schlecht indizierte Datenbank. 10-Minuten-Abfragen sind unter so engen Bedingungen akzeptabel, dass ich zu 100% sicher bin, dass sie in Ihrem Fall nicht akzeptabel sind.

Mit 99% iger Sicherheit erkläre ich, dass Ihr Deadlock durch einen großen Tabellenscan verursacht wird, der mit Aktualisierungen in Konflikt steht. Beginnen Sie mit der Erfassung des Deadlock-Diagramms , um die Ursache zu analysieren. Sie müssen sehr wahrscheinlich das Schema Ihrer Datenbank optimieren. Bevor Sie Änderungen vornehmen, lesen Sie dieses Thema Entwerfen von Indizes und die Unterartikel.


Vielen Dank für Ihre gründliche Antwort. Ich glaube, ich habe noch eine Frage. Warum sollte ich die Deadlock-Situation nur in einer Umgebung und nicht in einer anderen bekommen? Auch wenn die Software gleich ist. Ihre Antwort legt nahe, dass die Dauer der Ausführung der Select-Abfrage keinen Unterschied macht und dass die Tatsache, dass es sich um eine Select-Abfrage an sich handelt, dazu führt, dass der Prozess fehlschlägt. Aber warum nur, wenn die Ausführung der Auswahlabfrage lange dauert?
Elliott

4
Die Länge der Abfrage spielt bei der Auswahl des Deadlock-Opfers keine Rolle . Es macht einen Unterschied, den Deadlock durch mindestens zwei Faktoren zu verursachen: 1) einfache Wahrscheinlichkeiten. Je länger die Abfrage dauert, desto wahrscheinlicher ist es, dass sich gleichzeitige Aktualisierungen überschneiden und Deadlocks auftreten. 2) Eine größere Tabelle verwendet möglicherweise einen völlig anderen Abfrageplan, der für Deadlocks anfällig ist.
Remus Rusanu

12

Hier erfahren Sie, wie dieses spezielle Deadlock-Problem tatsächlich aufgetreten ist und wie es tatsächlich behoben wurde. Dies ist eine ziemlich aktive Datenbank mit täglich 130.000 Transaktionen. Die Indizes in den Tabellen in dieser Datenbank wurden ursprünglich geclustert. Der Kunde hat uns gebeten, die Indizes nicht gruppiert zu machen. Sobald wir das taten, begann die Blockade. Als wir die Indizes als Cluster wiederhergestellt haben, wurde das Deadlocking gestoppt.


34
Kann jemand erklären warum? (Magische Lösungen sind nicht sehr hilfreich)
OGrandeDiEnne

1
Dieser Typ erklärt es in seinem Beitrag: mssqltips.com/sqlservertip/2517/…
siga0984

6

Die Antworten hier sind einen Versuch wert, aber Sie sollten auch Ihren Code überprüfen. Lesen Sie hier speziell die Antwort von Polyfun: Wie können Sie Deadlocks in einer SQL Server 2005- und C # -Anwendung beseitigen ?

Es erklärt das Problem der Parallelität und wie die Verwendung von "with (updlock)" in Ihren Abfragen Ihre Deadlock-Situation korrigieren kann - abhängig davon, was genau Ihr Code tut. Wenn Ihr Code diesem Muster folgt, ist dies wahrscheinlich eine bessere Lösung, bevor Sie auf schmutzige Lesevorgänge usw. zurückgreifen.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.