确保释放悲观锁

Posted

技术标签:

【中文标题】确保释放悲观锁【英文标题】:Ensuring release of pessimistic lock 【发布时间】:2015-09-15 02:01:11 【问题描述】:

我正在考虑在使用 SQL Server 的 WinForms 保险报价应用程序中实现悲观锁定模式。在用户开始处理报价之前,将在锁定表中添加一条记录;完成后,记录将从表中删除。

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

【问题讨论】:

【参考方案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';

【讨论】:

谢谢。 sp_getapplock 正是我所需要的。

以上是关于确保释放悲观锁的主要内容,如果未能解决你的问题,请参考以下文章

乐观锁和悲观锁

悲观锁和乐观锁

乐观锁与悲观锁

什么是悲观锁和乐观锁

乐观锁悲观锁

乐观锁和悲观锁