Il ne suffit pas d'avoir une transaction sérialisable, vous devez indiquer le verrouillage pour que cela fonctionne.
Le niveau d'isolement sérialisable acquiert toujours généralement le type de verrou "le plus faible" possible, ce qui garantit que les conditions sérialisables sont remplies (lectures répétables, pas de lignes fantômes, etc.)
Donc, vous saisissez un verrou partagé sur votre table que vous essayez plus tard (dans votre transaction sérialisable) de mettre à niveau vers un verrou de mise à jour. La mise à niveau échouera si un autre thread détient le verrou partagé (cela fonctionnera si personne d'autre ne détient un verrou partagé).
Vous voudrez probablement le remplacer par ce qui suit :
SELECT * FROM SessionTest with (updlock) WHERE SessionId = @SessionId
Cela garantira qu'un verrou de mise à jour est acquis lorsque le SELECT est effectué (vous n'aurez donc pas besoin de mettre à niveau le verrou).