2015-09-15 5 views
0

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

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

ответ

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'; 
+0

Спасибо. 'sp_getapplock' был именно тем, что мне нужно. –

Смежные вопросы