SÉRIALISABLE est un niveau d'isolement pour le verrouillage, pas un sémaphore .
Cela ne fonctionnera pas dans ce cas, tout ce que vous ferez est de conserver un verrou de lecture jusqu'à la fin du TXN qui n'empêche pas un autre processus dans la lecture du code.
Vous devez utiliser sp_getapplock en mode transactions. Vous pouvez le configurer pour attendre, bombarder immédiatement etc :à vous de décider
Ceci est basé sur mon modèle de Procédures stockées imbriquées contenant le modèle TRY CATCH ROLLBACK ?
ALTER PROCEDURE get_code
AS
SET XACT_ABORT, NOCOUNT ON
DECLARE @starttrancount int, @result int;
BEGIN TRY
SELECT @starttrancount = @@TRANCOUNT
IF @starttrancount = 0 BEGIN TRANSACTION
EXEC @result = sp_getapplock 'get_code', 'Exclusive', 'Transaction', 0
IF @result < 0
RAISERROR('INFO: One at a time please`!', 16, 1);
[...Perform work...]
IF @starttrancount = 0
COMMIT TRANSACTION
ELSE
EXEC sp_releaseapplock 'get_code';
END TRY
BEGIN CATCH
IF XACT_STATE() <> 0 AND @starttrancount = 0
ROLLBACK TRANSACTION
RAISERROR [rethrow caught error using @ErrorNumber, @ErrorMessage, etc]
END CATCH
GO