Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Accès exclusif mutuel TSQL dans une procédure stockée

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