Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Gegenseitiger exklusiver TSQL-Zugriff in einer gespeicherten Prozedur

SERIALISIERBAR ist eine Isolationsstufe zum Sperren, kein Semaphor .

In diesem Fall funktioniert es nicht. Alles, was Sie tun müssen, ist, eine Lesesperre bis zum Ende des TXN aufrechtzuerhalten, die einen weiteren Prozess beim Lesen des Codes nicht verhindert.

Sie müssen sp_getapplock verwenden im Transaktionsmodus. Sie können es so konfigurieren, dass es wartet, sofort bombardiert usw.:bis zu Ihnen

Dies basiert auf meiner Vorlage von Verschachtelte gespeicherte Prozeduren mit TRY CATCH ROLLBACK-Muster?

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