Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Accesso esclusivo TSQL in una procedura memorizzata

SERIALIZABLE è un livello di isolamento per il blocco, non un semaforo .

In questo caso non funzionerà, tutto ciò che dovrai fare è mantenere un blocco di lettura fino alla fine del TXN che non impedisca un altro processo nella lettura del codice.

È necessario utilizzare sp_getapplock in modalità Transazione. Puoi configurarlo per attendere, bombardare immediatamente ecc:a te

Questo si basa sul mio modello di Procedure archiviate nidificate contenenti pattern 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