代码之家  ›  专栏  ›  技术社区  ›  drew.cuthbert

确保释放悲观锁

  •  0
  • drew.cuthbert  · 技术社区  · 9 年前

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

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

    1 回复  |  直到 9 年前
        1
  •  1
  •   Dan Guzman    9 年前

    考虑会话级应用程序锁,而不是锁定表( 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';