SqlException: Deadlock

8

Ich habe diese zwei Ausnahmen generiert, wenn ich versuche, Daten aus SQL-Datenbank in C #:

System.Data.SqlClient.SqlException: Die Transaktion (Prozess-ID 97) wurde beim Sperren von Ressourcen mit einem anderen Prozess blockiert und als Deadlock-Opfer ausgewählt.

ODER

System.Data.SqlClient.SqlException: Die Transaktion (Prozess-ID 62) wurde beim Sperren von Ressourcen mit einem anderen Prozess blockiert und wurde als Deadlock-Opfer ausgewählt.

ODER

System.Data.SqlClient.SqlException: Die Transaktion (Prozess-ID 54) wurde bei Sperrressourcen mit einem anderen Prozess blockiert und wurde als Deadlock-Opfer ausgewählt. Führen Sie die Transaktion erneut aus.

das ist der Code:

%Vor%

Diese Zeit hat sich alle entspannt.

Irgendwelche Ideen, wie diese gelöst werden können?

    
Harold SOTA 30.11.2010, 10:18
quelle

3 Antworten

7

Nicht, dass dies dem Deadlock-Problem helfen würde, aber Sie sollten Ihre anderen IDisposable -Objekte so verteilen, als würden Sie Ihre SqlConnection als solche entsorgen:

%Vor%

Sie können möglicherweise die Sperre mit einem Sperrhinweis in Ihrer Abfrage so vermeiden:

%Vor%

Hoffe, das hilft.

    
Jesse C. Slicer 30.11.2010, 14:36
quelle
16

Es gibt ein paar Dinge, die Sie tun können, um die Anzahl der Deadlocks zu verringern, die Sie erhalten, und einige Dinge, die Sie tun können, um sie vollständig zu beseitigen.

Starten Sie zunächst SQL Server Profiler und teilen Sie ihm mit, dass Sie ein Deadlock-Diagramm erhalten. Wenn Sie diesen Trace ausführen, erhalten Sie die andere -Abfrage, die mit Ihrem Konflikt in Konflikt steht. Ihre Abfrage ist ziemlich einfach, obwohl ich ernsthaft bezweifle, dass Sie eine SELECT * Abfrage einer Tabelle namens MyTable in Ihrem System haben ...

Wie auch immer, mit dem Deadlock-Diagramm und der anderen Abfrage sollten Sie in der Lage sein zu erkennen, welche Ressourcen Deadlocks sind. Die klassische Lösung besteht darin, die Reihenfolge beider Abfragen so zu ändern, dass auf die Ressourcen in derselben Reihenfolge zugegriffen wird - dies vermeidet Zyklen.

Andere Dinge, die Sie tun können:

  • Beschleunigen Sie Ihre Abfragen, indem Sie unter anderem die richtigen Indizes anwenden.
  • Aktivieren Sie die Snapshot-Isolation in der Datenbank und verwenden Sie ggf. SET TRANSACTION ISOLATION LEVEL SNAPSHOT in Ihren Transaktionen. Aktivieren Sie auch Lesen mit Zeilenversionierung festgeschrieben . In vielen Fällen reicht dies aus, um die meisten Deadlocks vollständig zu eliminieren. Lesen Sie über Transaktionsisolationsstufen. Verstehen was du tust.
Dave Markle 30.11.2010 14:08
quelle
3

Im Prinzip macht es das Parallelitätsmodell des SQL-Servers so, dass Sie diese Ausnahme niemals vermeiden können (z. B. können sich völlig unabhängige Transaktionen gegenseitig blockieren, wenn sie die gleiche Indexseite oder etwas Ähnliches sperren). Das Beste, was Sie tun können, ist, Ihre Transaktionen kurz zu halten, um die Wahrscheinlichkeit zu verringern. Wenn Sie die Ausnahme erhalten, tun Sie, was sie sagt, und wiederholen Sie die Transaktion.

    
erikkallen 30.11.2010 13:58
quelle