0

Ich bin Neuling als SQL Server DBA, jeden Tag mindestens einmal ich habe ein Deadlock-Problem in SQL Server 2012 Server, der Merge-Anweisung verwendet. Es gibt keine Klausel wie NOLOCK, UPDLOCK, HOLDLOCK wurde in der Zusammenführungs-Anweisung verwendet. Es handelt sich um eine Umgebung mit mehreren Benutzern, in der BizTalk das XML liest und Daten in SQL Server speichert.SQL Server Deadlock - Fix benötigt

Pro Minute liest BizTalk 300 XML-Nachrichten. Da es sich um einen Produktionsserver handelt, kann ich einfach nichts ohne Nachforschungen implementieren, aber ich habe keine Idee, wie ich dieses Problem lösen könnte. Kürzlich hatte ich ein Problem mit zwei XML-Nachrichten, die versuchten, Daten in einer Tabelle zu aktualisieren und zu versuchen, den gleichen Index und den Fehler zu verwenden, der ausging. Könnte mir jemand helfen, wie ich mit diesem Problem davon komme?

+0

Wenn Sie einen reproduzierbaren Fall bekommen können, führen Sie eine SQL-Trace während der Reproduktion durch und vergewissern Sie sich, dass alle "Deadlock" -Ereignisse verfolgt werden. Dies kann Ihnen Informationen darüber geben, was genau SQL blockiert und auf welche Ressource genau. Deadlocks resultieren fast immer aus einem Thread, der nach Ressource A und B geht, während ein anderer nach B und dann nach A geht. Manchmal können Sie Indizes hinzufügen oder entfernen, um den Deadlock zu entfernen, aber manchmal müssen Sie den Code überarbeiten, um immer Ressourcen zu erhalten Auftrag. – pmbAustin

+0

Ich nahm die Deadlock-Spur und verstand, wo das Problem liegt. Allerdings tritt der Deadlock nicht immer auf, sondern oft von der Merge-Anweisung, was mich ziemlich verwirrend macht, irgendeine Entscheidung zu treffen. – aprasy

+0

Das Deadlock-Diagramm sollte genau das Objekt anzeigen, das deadlocked ist (eine Objekt-ID, die beispielsweise einen bestimmten Index identifiziert). Dort müssen Sie anfangen. Es wird eine sehr große ID geben, und Sie können diese SQL verwenden, um genau zu dekodieren, worauf es sich bezieht: SELECT hobt_id, objektname (p. [Objekt_id]), index_id FROM sys.partition p WHERE hobt_id = 72057594060734464 - ersetzen durch Ihre spezifische Sperr-ID – pmbAustin

Antwort

0

Die Scan-Phase von MERGE wird mit einer gemeinsamen Sperre (S) ausgeführt, die für den Fall einer einzelnen Sitzung optimiert ist, in der MERGE und gleichzeitige Sitzungen mit SELECT ausgeführt werden. Bei mehreren gleichzeitigen MERGE-Anweisungen kann dies zu Deadlocks oder Fehlern führen.

Die Lösung, die Sie einen HOLDLOCK-Hinweis auf die Zieltabelle hinzufügen sollten. Dies ist ein wenig inkonsistent mit anderen Read-for-Update-Mustern, die UPDLOCK bei SELECT verwenden.

Verwandte Themen