确保释放悲观锁

Ensuring release of pessimistic lock

我正在考虑使用 SQL 服务器在 WinForms 保险报价应用程序中实施悲观锁定模式。在用户开始处理报价之前,将向锁添加一条记录table;完成后,记录将从 table.

中删除

我的问题是,如果发生应用程序无法控制的故障,我如何确保释放锁?我主要考虑的是客户端网络连接错误或电源故障,但有无限可能。

考虑会话级应用程序锁 (https://msdn.microsoft.com/en-us/library/ms189823.aspx) 而不是锁定 table。当 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';