Frage

Einer meiner Mitarbeiter hat ein gespeichertes Verfahren, das Folgendes ausführt
Beginnen Sie Tran
1) Generieren Sie dynamisch eine Auswahlanweisung.
2) In Tabelle x einfügen
3) Führen Sie die Auswahlanweisung aus
Ende tran

Wenn diese gespeicherte Prozedur gleichzeitig von zwei Septat -Threads ausgeführt wird, erhält er den folgenden Fehler: System.data.sqlclient.sqlexception: Transaktion (Prozess -ID 57) wurde bei Lock | abgestimmt Kommunikationspufferressourcen mit einem anderen Prozess und wurde als Deadlock -Opfer ausgewählt. Die Transaktion erneut ausführen

Ist diese gespeicherte Prozedur wirklich das Problem? Aus meinem naiven Verstand scheint dies eine Rennbedingung zu sein, nicht um einen Deadlock.

War es hilfreich?

Lösung

Zwei 'Schreiben, dann lesen' Sequenzen können definitiv tadeln. Sie haben einige "Details" in Ihrem Beitrag weggelassen, z. Wir werden an der Sitzung unserer Hose fliegen und zwischen den Zeilen lesen, wobei wir einen Großteil des Falles aus einem so schlecht dokumentierten Beitrag ausmachen:

  1. Cross Write-Read. Thread 1 fügt Zeile mit Taste A ein und wählt dann Zeile mit Taste B. Thread 2 Einfügt Zeile mit der Taste B eins (A) -Deadlock.
  2. Independent Write-Read: T1 fügt A ein. Dann liest A, T2 Einfügungen B und liest dann B. Kritische Informationen: Es gibt keinen Index auf dem Schlüssel, daher ist ein Tabel -Scan erforderlich, um a und/oder B zu lesen. Ausführungsreihenfolge ist T1 schreibt A, T2 schreibt B, T1 liest A, startet Scan, Blöcke auf T2s X-Lock auf B, T2 liest B, Startscan, Blöcke auf T1s X-Lock auf A, Deadlock.
  3. Unabhängig optimiert schreiben Lesen. Dieser Fall ist für die meisten Neuankömmlinge am meisten Bafeling, wenn die ordnungsgemäßen Zugangsindizes vorhanden sind und dennoch Deadlocks auftreten. Ich habe diesen Fall in präsentiert Deadlock lesen/schreiben, Ein Update kann aufgrund einer unterschiedlichen Indexzugriffsreihenfolge eine Lektüre abhielten. Es ist unwahrscheinlich, dass es Ihr Fall ist, aber mit einer solchen schlechten Dokumentation ist alles möglich.

Viele, viele weitere Deadlock -Szenarien sind möglich, aber wir würden Esoteriker eingeben oder anfangen, weit weit zu extrapolieren, um die fehlenden Informationen im OP zu fehlen.

Wenn ich eine Vermutung wagen würde, ist der wahrscheinlichste Fall 2). Der Fall 1) wäre wahrscheinlich leicht zu bezeichnen. Fall 2) ist in der einfachen Codeanalyse etwas schwerer zu erkennen, da es sich um das physikalische Schema -Design (Indexstruktur) handelt.

Andere Tipps

Führen Sie eine Ablaufverfolgung im Profiler aus (wählen Sie die leere Vorlage aus), wählen Sie das Deadlock -Diagrammereignis und auf der neuen Registerkarte (Ereignisextraktionseinstellungen), speichern Sie jedes (prüfen Sie die SADLOCK -Ereignisse XML -Ereignisse separat) in seiner eigenen Datei. Öffnen Sie diese Datei in einem XML -Viewer und es wird leicht zu erkennen, was passiert. Jeder Prozess ist mit einem Stapel Prozeduranrufe usw. enthalten und alle Schlösser sind auch dort drin, sodass Sie sicher sein können, was den Deadlock verursacht.

Lassen Sie diese Spuren laufen, bis die Deadlock wieder passiert. Infos werden nur dann aufgezeichnet, wenn ein Deadlock stattfindet, also nicht viel Overhead.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top