2010-01-13 4 views
14

Ich schreibe eine Anwendung in C#, die auf eine SQL Server 2005-Datenbank zugreift. Die Anwendung ist ziemlich datenbankintensiv, und selbst wenn ich versuche, alle Zugriffe zu optimieren, korrekte Indizes einzurichten usw. erwarte ich früher oder später Deadlocks. Ich weiß, warum Datenbank-Deadlocks auftreten, aber ich bezweifle, dass ich in der Lage sein werde, die Software ohne Deadlocks zu veröffentlichen, die irgendwann auftreten. Die Anwendung verwendet Entity Framework für den Datenbankzugriff.Muster für die Behandlung eines SQL-Deadlocks in C#?

Gibt es ein gutes Muster für die Behandlung von SQLExceptions (deadlocked) im C# -Clientcode - zum Beispiel um den Anweisungsstapel nach x Millisekunden erneut auszuführen?

Um zu klären; Ich suche nicht nach einer Methode, wie man Deadlocks überhaupt vermeiden kann (Isolationsebenen, Indizes, Reihenfolge der Anweisungen usw.), sondern wie man mit ihnen umgeht, wenn sie tatsächlich auftreten.

Antwort

4

Hier ist der Ansatz, den wir im letzten Anwendungsrahmen, an dem ich arbeitete, gemacht haben. Als wir einen Deadlock feststellten, haben wir die Transaktion einfach erneut durchgeführt. Wir haben das bis zu 5 mal gemacht. Wenn es nach 5 Versuchen fehlschlug, würden wir eine Ausnahme auslösen. Ich erinnere mich nicht an eine Zeit, in der der zweite Versuch gescheitert ist. Wir würden es wissen, weil wir alle Aktivitäten im Backend-Code protokolliert haben. Wir wussten also jedes Mal, wenn ein Deadlock auftrat, und wir wussten, ob es mehr als fünf Mal fehlschlug. Dieser Ansatz hat für uns gut funktioniert.

Randy

+1

Können Sie mir sagen, wie Sie die eigentliche Durchführung der Transaktion durchgeführt haben? Haben Sie an jedem Ort, an dem Sie eine Transaktion durchgeführt haben, eine einfache For-Schleife um den Code gelegt oder haben Sie eine allgemeinere Lösung gefunden? – martin

+1

Wir haben eine Schleife implementiert. Wenn die Transaktion wegen einer Deadlock-Situation fehlgeschlagen ist, haben wir die gesamte Transaktion zurückgesetzt und erneut bis zu 5 Mal versucht. –

6

Ich schrieb einen Code Probe genau vor einiger Zeit diese ein zu handhaben, aber so schien mein Konto in der Zwischenzeit zu verlieren, damit ich jetzt nicht finden kann es ich habe Angst und haben nicht die Code, den ich hier benutzt habe.

Kurze Antwort - wickeln Sie das Ding in einem Versuch..Catch. Wenn Sie einen Fehler entdecken, der wie ein Deadlock aussieht, schlafen Sie für eine kurze zufällige Zeit und inkrementieren Sie den Zähler erneut. Wenn Sie einen weiteren Fehler erhalten oder der Wiederholungszähler Ihren Schwellenwert löscht, werfen Sie den Fehler zurück auf die aufrufende Routine.

(Und wenn Sie können, versuchen Sie dies in einer allgemeinen Routine pfropfen und die meisten laufen/alle Ihre DB-Zugriff durch sie, so dass Sie Umgang mit Deadlocks programmweit.)

EDIT: Ah, lehre mich Google nicht benutzen! Das vorherige Codebeispiel I und andere gab es unter How to get efficient Sql Server deadlock handling in C# with ADO?

Verwandte Themen