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

TSQL gensidig eksklusiv adgang i en lagret procedure

SERIALIZABLE er et isolationsniveau for låsning, ikke en semafor .

Det vil ikke fungere i dette tilfælde, alt hvad du skal gøre er at fortsætte en læselås til slutningen af ​​TXN, der ikke forhindrer en anden proces i kodelæsningen.

Du skal bruge sp_getapplock i transaktionstilstand. Du kan konfigurere den til at vente, bombe med det samme osv.:op til dig

Dette er baseret på min skabelon fra Indlejrede lagrede procedurer, der indeholder PRØV FANG TILBAGE TILBAGE-mønster?

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


  1. Hurtigste måde at fjerne ikke-numeriske tegn fra en VARCHAR i SQL Server

  2. Pivot flere tabeller med standardværdier

  3. Forårsaget af:java.sql.SQLEundtagelse:Adgang nægtet for brugeren 'root'@'localhost' (ved hjælp af adgangskode:JA)

  4. Skinner 4 session.id lejlighedsvis nul