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

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

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

【问题讨论】:

    标签: c# sql-server concurrency pessimistic-locking


    【解决方案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 正是我所需要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-06
    • 2010-09-12
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多