Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Wzajemny wyłączny dostęp TSQL w procedurze składowanej

SERIALIZOWALNY to poziom izolacji dla blokowania, a nie semafor .

To nie zadziała w tym przypadku wszystko, co zrobisz, to utrwalenie blokady odczytu do końca TXN, co nie przeszkadza w odczycie kodu przez inny proces.

Musisz użyć sp_getapplock w trybie transakcyjnym. Możesz go skonfigurować tak, aby czekał, natychmiast bombardował itp.:do Ciebie

Jest to oparte na moim szablonie z Zagnieżdżone procedury składowane zawierające wzorzec 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dodaj kolumnę do tabeli, a następnie zaktualizuj ją w transakcji

  2. Instrukcja SQL do wstawienia rekordu do tabeli, która ma kolumnę tożsamości?

  3. Pobierz poprzedni i następny wiersz z wierszy wybranych z warunkami (WHERE)

  4. Przetwarzaj ciąg znaków oddzielonych przecinkami, aby utworzyć IN Lista ciągów w klauzuli Where

  5. SQL Server BIGINT lub DECIMAL (18,0) dla klucza podstawowego