これが機能するためにロックをヒントする必要があるシリアル化可能なトランザクションを持つだけでは十分ではありません。
シリアライズ可能な分離レベルは、通常、シリアライズ可能な条件 (反復可能な読み取り、ファントム行がないなど) が確実に満たされるようにすることができる「最も弱い」タイプのロックを取得します。
したがって、後で (シリアル化可能なトランザクションで) 更新ロック。 別のスレッドが共有ロックを保持している場合、アップグレードは失敗します (他のスレッドが共有ロックを保持していなければ機能します)。
おそらく次のように変更する必要があります:
SELECT * FROM SessionTest with (updlock) WHERE SessionId = @SessionId
プレ>これにより、SELECT の実行時に更新ロックが確実に取得されます (したがって、ロックをアップグレードする必要はありません)。