Frage Ursache eines Prozesses, der ein Deadlock-Opfer ist


Ich habe einen Prozess mit einem Select, der viel Zeit in Anspruch nimmt, in der Größenordnung von 5 bis 10 Minuten.
Ich benutze NOLOCK derzeit nicht als Hinweis auf die MS SQL-Datenbank-Engine.
Gleichzeitig haben wir einen anderen Prozess, der Aktualisierungen durchführt und in dieselbe Datenbank und dieselben Tabellen einfügt.
 Der erste Prozess wurde gestartet, der kürzlich mit einer Nachricht vorzeitig beendet wurde

SQLEXCEPTION: Die Transaktion wurde bei Sperren von Ressourcen mit einem anderen Prozess blockiert und wurde als Deadlock-Opfer ausgewählt.

Dieser erste Prozess läuft an anderen Standorten unter identischen Bedingungen, jedoch mit kleineren Datenbanken, und daher benötigt die betreffende Auswahlanweisung einen viel kürzeren Zeitraum (in der Größenordnung von etwa 30 Sekunden). In diesen anderen Sites erhalte ich die Deadlock-Nachricht in diesen anderen Sites nicht. Ich habe diese Nachricht auch nicht an der Stelle erhalten, an der das Problem anfänglich auftritt, aber ich nehme an, da die Datenbank gewachsen ist, glaube ich, dass ich eine Schwelle überschritten haben muss. Hier sind meine Fragen:

  1. Könnte die Zeit, die für die Ausführung einer Transaktion benötigt wird, dazu führen, dass der zugehörige Prozess eher als Deadlock-Opfer gekennzeichnet wird?
  2. Wenn ich die Auswahl mit einem NOLOCK-Hinweis ausführe, wird dadurch das Problem behoben?
  3. Ich vermute, dass ein Datetime-Feld, das als Teil der WHERE-Klausel in der Select-Anweisung überprüft wird, die langsame Suchzeit verursacht. Kann ich einen Index basierend auf diesem Feld erstellen? Ist es ratsam?

76
2017-12-05 18:52


Ursprung


Antworten:


Q1: Könnte die Zeit, die für die Ausführung einer Transaktion benötigt wird, dazu führen, dass der zugehörige Prozess eher als Deadlock-Opfer gekennzeichnet wird?

Nein. Das SELECT ist das Opfer, weil es nur Daten gelesen hat, also die Transaktion hat eine niedrigere Kosten damit verbunden ist also als Opfer gewählt:

Standardmäßig wählt das Datenbankmodul das Deadlock-Opfer aus   Sitzung, in der die Transaktion ausgeführt wird am wenigsten teuer, um zurückzurollen.   Alternativ kann ein Benutzer die Priorität von Sitzungen in a angeben   Deadlock - Situation mit dem SET DEADLOCK_PRIORITY Erklärung.   DEADLOCK_PRIORITY kann auf LOW, NORMAL oder HIGH oder alternativ eingestellt werden   kann auf einen beliebigen ganzzahligen Wert im Bereich (-10 bis 10) gesetzt werden.

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

Nein. Aus verschiedenen Gründen:

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

Wahrscheinlich. Die Ursache des Deadlocks ist fast wahrscheinlich eine schlecht indizierte Datenbank. 10 Minuten Abfragen sind unter so engen Bedingungen akzeptabel, dass ich in Ihrem Fall 100% sicher bin nicht akzeptabel.

Mit 99% Vertrauenswürdigkeit erkläre ich, dass Ihr Deadlock durch einen großen Tabellenscan verursacht wird, der mit Aktualisierungen kollidiert. Beginnen Sie mit der Erfassung der Deadlock-Grafik um die Ursache zu analysieren. Sie werden sehr wahrscheinlich das Schema Ihrer Datenbank optimieren müssen. Bevor Sie Änderungen vornehmen, lesen Sie dieses Thema Indizes entwerfen und die Unterartikel.


96
2017-12-05 19:13



Hier ist, wie dieses spezielle Deadlock-Problem tatsächlich aufgetreten ist und wie es tatsächlich gelöst wurde. Dies ist eine ziemlich aktive Datenbank mit 130.000 Transaktionen täglich. Die Indizes in den Tabellen in dieser Datenbank wurden ursprünglich gruppiert. Der Client hat uns gebeten, die Indizes nicht gruppiert zu machen. Sobald wir es taten, begann die Sackgasse. Als wir die Indizes wieder gruppiert hatten, stoppte das Deadlocking.


9
2017-12-14 22:54



Die Antworten hier sind einen Versuch wert, aber Sie sollten auch Ihren Code überprüfen. Lesen Sie Polyfun's Antwort hier: Wie Deadlock in einer SQL Server 2005- und C # -Anwendung loswerden?

Es erklärt das Problem der Parallelität, und wie die Verwendung von "mit (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 zurückgreifen.


2
2017-09-28 05:14