SQL Server Deadlock Fix: Beitrittsreihenfolge erzwingen oder automatisch wiederholen?

Ich habe eine gespeicherte Prozedur, die einen Join von ausführtTableB zuTableA:

 SELECT <--- Nested <--- TableA
             Loop   <--
                      |
                      ---TableB

Gleichzeitig werden in einer Transaktion Zeilen eingefügtTableAund dann hineinTableB.

Diese Situation führt gelegentlich zu Deadlocks, da die gespeicherte Prozedur Zeilen abruftTabelleB, während die Einfügung Zeilen hinzufügtTableAund dann möchte jeder, dass der andere den anderen Tisch loslässt:

INSERT     SELECT
=========  ========
Lock A     Lock B
Insert A   Select B
Want B     Want A
....deadlock...

Logik erfordert dieINSERT um zuerst Zeilen zuAund dann zuBDabei ist mir die Reihenfolge, in der der SQL Server seinen Join durchführt, egal - solange er beitritt.

Die allgemeine Empfehlung zum Beheben von Deadlocks lautet, sicherzustellen, dass alle Benutzer in derselben Reihenfolge auf Ressourcen zugreifen. Aber in diesem Fall sagt mir der Optimierer von SQL Server, dass die umgekehrte Reihenfolge "besser" ist. Ich kann eine andere Join-Reihenfolge erzwingen und habe eine schlechtere Abfrage.

Aber soll ich?

Sollte ich den Optimierer jetzt und für immer mit einer Verknüpfungsreihenfolge überschreiben, die ich verwenden möchte?

Oder sollte ich nur Fehler abfangennativer Fehler 1205, und die select-Anweisung erneut übermitteln?

Die Frage ist nicht, wie viel schlimmer die Abfrage durchführen könnte, wenn ich den Optimierer überschreibe und damit es etwas nicht optimales tut. Die Frage ist: Ist es besser, es automatisch erneut zu versuchen, als schlechtere Abfragen auszuführen?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage