我正在考虑在使用 SQL Server 的 WinForms 保险报价应用程序中实现悲观锁定模式。在用户开始处理报价之前,将在锁定表中添加一条记录;完成后,记录将从表中删除。
我的问题是,如果发生超出我的应用程序控制的故障,我如何确保释放锁?我主要考虑客户端网络连接错误或电源故障,但有无限可能。
我正在考虑在使用 SQL Server 的 WinForms 保险报价应用程序中实现悲观锁定模式。在用户开始处理报价之前,将在锁定表中添加一条记录;完成后,记录将从表中删除。
我的问题是,如果发生超出我的应用程序控制的故障,我如何确保释放锁?我主要考虑客户端网络连接错误或电源故障,但有无限可能。
考虑使用会话级应用程序锁( 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';