Обеспечение снятия пессимистической блокировки

Я рассматриваю возможность реализации шаблона пессимистической блокировки в приложении WinForms для расчета страховых котировок с использованием SQL Server. Перед тем, как пользователь начнет работать над котировкой, в таблицу блокировок будет добавлена ​​запись; когда они будут выполнены, запись будет удалена из таблицы.

Мой вопрос: как я могу гарантировать, что блокировка будет снята в случае сбоя, который находится вне контроля моего приложения? Я думаю в основном об ошибках сетевого подключения на стороне клиента или сбоях питания, но есть бесконечные возможности.


person andrew.cuthbert    schedule 15.09.2015    source источник


Ответы (1)


Вместо таблицы блокировки рассмотрите блокировку приложения на уровне сеанса (https://msdn.microsoft.com/en-us/library/ms189823.aspx). Блокировка будет снята, когда сеанс SQL будет прерван по какой-либо причине или при явном освобождении.

--acquire lock
DECLARE
      @ReturnCode int
    , @ClientID nvarchar(255) = '12345';

EXEC  @ReturnCode = sp_getapplock
      @Resource = @ClientID
    , @LockMode = N'Exclusive' 
    , @LockOwner = 'Session'
    , @LockTimeout = 0;

IF @ReturnCode < 0
BEGIN
    RAISERROR('Lock for quote not be granted for ClientID %s. Return code=%d', 16, 1, @ClientID, @ReturnCode);
END;

--release lock
DECLARE
      @ReturnCode int
    , @ClientID nvarchar(255) = '12345';

EXEC  @ReturnCode = sp_releaseapplock
      @Resource = @ClientID
    , @LockOwner = 'Session';
person Dan Guzman    schedule 15.09.2015
comment
Спасибо. sp_getapplock было именно то, что мне было нужно. - person andrew.cuthbert; 15.09.2015