sql >> Databáze >  >> RDS >> Sqlserver

Vzájemný exkluzivní přístup TSQL v uložené proceduře

SERIALIZOVATELNÉ je úroveň izolace pro zamykání, nikoli semafor .

V tomto případě to nebude fungovat, vše, co uděláte, je zachovat zámek čtení na konec TXN, který nebrání dalšímu procesu ve čtení kódu.

Musíte použít sp_getapplock v Transakčním režimu. Můžete jej nakonfigurovat tak, aby čekal, okamžitě bombardoval atd.:záleží na vás

Toto je založeno na mé šabloně z Vnořené uložené procedury obsahující vzor 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


  1. ORA-01658:nelze vytvořit INITIAL rozsah pro segment v tabulkovém prostoru TS_DATA

  2. Získání ORA-22922 (neexistující hodnota LOB) nebo žádný výsledek pomocí wm_concat()

  3. Jak vypočítat medián v MySQL

  4. Jak spustit ad-hoc skript v PostgreSQL?