Ich habe eine Tabelle in SQL Server, die gleichzeitig von einer gespeicherten Prozedur CRUD-ed ist, die gleichzeitig in verschiedenen Sitzungen ausgeführt wird:
|----------------|---------|
| <some columns> | JobGUID |
|----------------|---------|
Das Verfahren funktioniert wie folgt:
Jede Anweisung select / insert / update / delete in der gespeicherten Prozedur hat eine WHERE JobGUID = @jobGUID
-Klausel, so dass die Prozedur nur mit den in Schritt 2 eingefügten Datensätzen funktioniert. Manchmal jedoch, wenn die gleiche gespeicherte Prozedur in parallel ausgeführt wird Bei verschiedenen Verbindungen treten Deadlocks in der gemeinsam genutzten Tabelle auf. Hier ist das Deadlock-Diagramm von SQL Server Profiler:
Lock-Eskalationen treten nicht auf. Ich habe versucht, (UPDLOCK, ROWLOCK)
locking Hints zu allen DML-Anweisungen hinzuzufügen und / oder den Rumpf der Prozedur in eine Transaktion zu wickeln und verschiedene Isolationsstufen zu verwenden, aber es hat nicht geholfen. Immer noch die gleiche RID für die gemeinsame Tabelle sperren.
Danach habe ich festgestellt, dass die gemeinsame Tabelle keine Primärschlüssel / Identitätsspalte hatte. Und sobald ich es hinzugefügt habe, scheinen Deadlocks verschwunden zu sein:
%Vor%Wenn ich die Primärschlüsselspalte entferne, sind die Deadlocks zurück. Wenn ich es zurück addiere, kann ich den Deadlock nicht mehr reproduzieren.
Also, die Frage ist, ist eine primäre Schlüsselidentitätsspalte wirklich in der Lage Deadlocks aufzulösen oder ist es nur ein Zufall?
Update: als @Catcall schlägt vor, ich habe es versucht Erstellen eines natürlichen geclusterten Primärschlüssels für die vorhandenen Spalten (ohne Hinzufügen einer Identitätsspalte), aber immer noch denselben Deadlock (natürlich war es diesmal eine Tastensperre anstelle der RID-Sperre).
Die beste Ressource (noch) für die Deadlock-Auflösung ist hier: Ссылка .
Pt # 4 sagt:
Führen Sie die mit dem Deadlock verbundenen Abfragen durch das Datenbank-Tuning aus Berater. Plop die Abfrage in einem Management Studio-Abfragefenster ändern Klicken Sie mit der rechten Maustaste auf den Abfragetext und dann auf den Datenbankkontext zur richtigen Datenbank Wählen Sie "Abfrage in DTA analysieren". Überspringen Sie diesen Schritt nicht. mehr als die Hälfte Die Deadlock-Probleme, die wir sehen, werden einfach gelöst, indem ein hinzugefügt wird entsprechender Index, so dass eine der Abfragen schneller ausgeführt wird und mit einem kleineren Schließfußabdruck. Wenn DTA empfiehlt Indizes (es wird sagen "Geschätzte Verbesserung:%"), erstellen Sie sie und überwachen Sie sie Prüfen Sie, ob der Deadlock bestehen bleibt. Sie können "Empfehlungen anwenden" auswählen. aus dem Dropdown-Menü Aktion, um den Index sofort zu erstellen, oder Speichern Sie die CREATE INDEX-Befehle als Skript, um sie während eines Befehls zu erstellen Wartungsfenster. Stellen Sie sicher, dass Sie die einzelnen Abfragen separat einstellen.
Ich weiß, dass dies die Frage, warum es notwendig ist, nicht "beantwortet", aber es zeigt, dass das Hinzufügen von Indizes die Ausführung so ändern kann, dass entweder der Sperrspeicher kleiner wird oder die Ausführungszeit schneller wird, was die Chancen auf ein Deadlock.
Vor kurzem habe ich diesen Beitrag gesehen, nach obigen Informationen hoffe ich, dass dieser Beitrag Ihnen helfen wird,
Tags und Links sql-server concurrency primary-key deadlock