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?
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
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
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