Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Acesso exclusivo mútuo TSQL em um procedimento armazenado


SERIALIZABLE é um nível de isolamento para bloqueio, não um semaphore .

Não funcionará neste caso, tudo o que você fará é persistir um bloqueio de leitura no final do TXN que não impeça outro processo na leitura do código.

Você precisa usar sp_getapplock no modo Transação. Você pode configurá-lo para esperar, bombar imediatamente etc:até você

Isso é baseado no meu modelo de Procedimentos armazenados aninhados contendo o padrão 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