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

Deadlock bei SELECT/UPDATE

Es reicht nicht aus, eine serialisierbare Transaktion zu haben, Sie müssen auf die Sperrung hinweisen, damit dies funktioniert.

Die serialisierbare Isolationsstufe erhält normalerweise immer noch die "schwächste" Art von Sperre, die sie erreichen kann, wodurch sichergestellt wird, dass die serialisierbaren Bedingungen erfüllt werden (wiederholbare Lesevorgänge, keine Phantomzeilen usw.)

Sie ergreifen also eine gemeinsame Sperre für Ihre Tabelle, die Sie später (in Ihrer serialisierbaren Transaktion) versuchen, auf eine Aktualisierungssperre. Das Upgrade schlägt fehl, wenn ein anderer Thread die gemeinsame Sperre hält (es funktioniert, wenn kein Körper sonst eine gemeinsame Sperre hält).

Wahrscheinlich möchten Sie es wie folgt ändern:

SELECT * FROM SessionTest with (updlock) WHERE SessionId = @SessionId

Dadurch wird sichergestellt, dass eine Aktualisierungssperre erworben wird, wenn das SELECT durchgeführt wird (so dass Sie die Sperre nicht aktualisieren müssen).