Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

TSQL взаимен изключителен достъп в съхранена процедура

SERIALIZABLE е ниво на изолация за заключване, а не семафор .

В този случай няма да работи, всичко, което ще направите, е да запазите заключване за четене до края на TXN, което не предотвратява друг процес в четенето на кода.

Трябва да използвате sp_getapplock в режим Транзакция. Можете да го конфигурирате да чака, бомбардира веднага и т.н.:зависи от вас

Това се основава на моя шаблон от Вложени съхранени процедури, съдържащи модел 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. Добавяне на стойност по подразбиране към съществуваща колона въз основа на If Then Else sql сървър 2008

  2. MIN и MAX агрегатни функции в SQL Server

  3. Не може да се използва агрегат или подзаявка в израз, използван за групиране по списък на клауза GROUP BY

  4. Как да задам стойност на променлива с помощта на 'execute' в t-sql?

  5. Sql Server Profiler Безплатен инструмент