Kann das Hinzufügen einer Primärschlüsselidentitätsspalte Deadlock-Probleme lösen?

9

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:

  1. Erzeuge eine GUID.
  2. Fügen Sie einige Datensätze in die oben beschriebene gemeinsame Tabelle ein und markieren Sie sie mit der GUID aus Schritt 1.
  3. Führen Sie einige Aktualisierungen für alle Datensätze aus Schritt 2 durch.
  4. Wählen Sie die Datensätze aus Schritt 3 als SP-Ausgabe aus.

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).

    
Yuriy Guts 24.05.2012, 12:15
quelle

2 Antworten

4

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.

    
Kelly Summerlin 24.05.2012, 13:51
quelle
1

Vor kurzem habe ich diesen Beitrag gesehen, nach obigen Informationen hoffe ich, dass dieser Beitrag Ihnen helfen wird,

Ссылка

    
Tharindu Dhaneenja 08.10.2013 10:27
quelle