Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Deadlock-Rätsel:Das Opfer besitzt keine Ressource, die verwendet wird, um zu töten, um Deadlocks zu lösen

Im Zusammenhang mit Sperren sind Tabellen und ihre zugehörigen Indizes separate Einheiten. Manchmal findet Dead Locking zwischen einer Tabelle und ihrem Index statt, anstatt zwischen zwei separaten Tabellen.

Das Problem tritt am wahrscheinlichsten auf, wenn eine Sperre für einen Index erworben wird und dann eine weitere Sperre für die zugehörige Tabelle (d. h. bar) erworben wird, um die Datensuche durchzuführen. Beim Einfügen geschieht dies in umgekehrter Reihenfolge. Zuerst wird die Tabelle (d. h. bar) gesperrt und aktualisiert, dann werden die Indizes gesperrt.

select foo 
from bar 
where @someId = 0 OR SomeId = @someId

Haben Sie/können Sie einen abdeckenden Index hinzufügen (um bei der Auswahl zu helfen), der sowohl SomeId als auch foo enthält? Auf diese Weise vermeiden Sie die Suche vollständig und verhindern, dass das Problem auftritt.

Können Sie die Abfragepläne anstelle von Deadlock-Frames posten?