Sind alle Deadlocks durch eine schlechte Abfrage verursacht

"Transaktion (process-ID 63) wurde auf Sperr-Kommunikationspuffer-Ressourcen mit einem anderen process verriegelt und wurde als Deadlock-Opfer gewählt. Führen Sie die Transaktion erneut aus." Mögliche Fehlergründe: Probleme mit der Abfrage, "ResultSet" -Eigenschaft nicht richtig gesetzt, Parameter nicht richtig gesetzt oder Verbindung nicht korrekt eingerichtet. "

Könnte diese Deadlock durch etwas verursacht werden, das proc verwendet, wie SQL Mail verwendet? Oder ist es immer so etwas wie zwei Anwendungen, die gleichzeitig auf denselben Tisch zugreifen?

Zwei Tabellen, die gleichzeitig auf dieselbe Tabelle zugreifen, passiert die ganze time in einer Anwendung. Im Allgemeinen wird das nicht zu einem Deadlock führen. Ein Deadlock tritt normalerweise auf, wenn man den process 'A' versucht, Tabelle 1 und dann Tabelle 2 und dann Tabelle 3 zu aktualisieren, und Sie haben process 'B' versuchen, Tabelle 3 zu aktualisieren, dann Tabelle 2 und dann Tabelle 1. process ' A 'wird eine Ressource gesperrt haben, dass process' B 'braucht und verarbeitet' B 'hat einen Ressourcenprozess' A 'braucht. SQL server erkennt dies als Deadlock und rollt einen der processe zurück, als fehlgeschlagene Transaktion.

Die Quintessenz ist, dass Sie zwei processe haben, die versuchen, die gleichen Tabellen gleichzeitig zu aktualisieren, aber nicht in der gleichen Reihenfolge. Dies führt oft zu Deadlocks.

Eine einfache Möglichkeit, dies in Ihrer Anwendung zu behandeln, ist, die fehlgeschlagene Transaktion zu behandeln und einfach die Transaktion erneut auszuführen. Es wird fast immer erfolgreich ausgeführt. Eine bessere Lösung ist, um sicherzustellen, dass Ihre processe Tabellen in der gleichen Reihenfolge aktualisieren, so viel wie möglich.

Fehlende Indizes sind eine weitere häufige Ursache für Deadlocks. Wenn eine select-Abfrage die von einem Index anstelle der Basistabelle benötigten Informationen abrufen kann, wird sie nicht durch Updates / Einsätze auf der Tabelle selbst gesperrt.

Um herauszufinden, sicher, verwenden Sie die SQL-Profiler zu Trace für "Deadlock Graph" events, die Ihnen zeigen, das Detail der Deadlock selbst.

Auf der Grundlage dieser , ich glaube nicht, dass SQL Mail selbst wäre direkt der Täter. Ich sage "direkt", weil ich nicht weiß was du damit machst. Allerdings nehme ich an, dass SQL Mail ist wahrscheinlich langsam im Vergleich zu den Rest Ihrer SQL-Ops, also wenn Sie viel mit dem tun, könnte es indirekt einen Engpass, der zu einem Deadlock führt, wenn Sie auf Tische halten beim Senden aus die SQL Mail.

Es ist schwer, eine spezifische Strategie zu empfehlen, ohne zu viele Besonderheiten zu haben, was du tust. Es ist nicht so, dass man bedenkt, ob es eine Möglichkeit gibt, Ihre Abhängigkeit vom Halten auf den Tisch zu brechen, während Sie dies tun, wie zum Beispiel mit NOLOCK, mit einem Temp-Tabelle oder Nicht-Temp-"Halten" Tisch oder einfach nur Refactoring der SP das macht den anruf