Nie wystarczy mieć transakcję z możliwością serializacji, musisz wskazać blokadę, aby to zadziałało.
Serializowany poziom izolacji nadal zwykle uzyskuje „najsłabszy” typ blokady, jaki może, co zapewnia spełnienie możliwych do serializacji warunków (powtarzalne odczyty, brak wierszy fantomowych itp.)
Tak więc chwytasz wspólną blokadę na swoim stole, którą później (w transakcji możliwej do serializacji) próbujesz uaktualnić do blokada aktualizacji. Aktualizacja nie powiedzie się, jeśli inny wątek będzie trzymać wspólną blokadę (będzie działać, jeśli żadne inne ciało nie będzie trzymało wspólnej blokady).
Prawdopodobnie chcesz to zmienić na następujące:
SELECT * FROM SessionTest with (updlock) WHERE SessionId = @SessionId
Zapewni to uzyskanie blokady aktualizacji po wykonaniu SELECT (więc nie będziesz musiał aktualizować blokady).