sql >> Databasteknik >  >> RDS >> Sqlserver

TSQL ömsesidig exklusiv åtkomst i en lagrad procedur

SERIALISERBAR är en isoleringsnivå för låsning, inte en semafor .

Det kommer inte att fungera i det här fallet allt du behöver göra är att bevara ett läslås till slutet av TXN som inte hindrar en annan process i kodläsningen.

Du måste använda sp_getapplock i transaktionsläge. Du kan konfigurera den att vänta, bomba omedelbart etc:upp till dig

Detta är baserat på min mall från Inkapslade lagrade procedurer som innehåller TRY CATCH ROLLBACK-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. virtualenv, mysql-python, pip:någon som vet hur?

  2. Mer om CXPACKET Waits:Skewed Parallelism

  3. Hur använder man Timestamp_to_scn och Scn_to_timestamp i Oracle?

  4. Hur man ställer in maxrekursionsalternativet för en CTE i en tabellvärderad-funktion