【问题标题】:Mutex Stored Procedure互斥存储过程
【发布时间】:2010-10-16 22:57:28
【问题描述】:

我想使用数据库表创建一些分布式互斥。如果在存储过程上有如下接口就好了:

等待(唯一标识符)

我最初是想通过一个唯一标识符表来实现这一点。对该过程的调用将一直等到表中不存在唯一标识符。但是,我不确定当从表中删除指定的唯一标识符时如何让调用线程唤醒。

有什么想法吗?如果数据库不适合这样做,是否有任何第三方工具可以工作(最好是开源的)?

(为了避免死锁,我要么想在等待操作中包含一个超时,要么让 SqlCommand 有一个超时)

【问题讨论】:

    标签: c# sql-server concurrency distributed mutual-exclusion


    【解决方案1】:

    看一下系统存储过程:

     sp_getapplock
    

    它可以帮助你完成你想做的事情。

    http://msdn.microsoft.com/en-us/library/ms189823.aspx

    你可以把它放在一个参数化唯一标识符的过程中......

    BEGIN TRAN
    
    DECLARE @result int
    
    EXEC @result = sp_getapplock @Resource = 'YOUR_uniqueidentifier_HERE', 
                                 @LockMode = 'Exclusive',
                                 @LockTimeout = 90
    
    IF @result NOT IN ( 0, 1 )   -- Only successful return codes
    BEGIN
      PRINT @result
      RAISERROR ( 'Lock failed to acquire...', 16, 1 )
    END 
    ELSE
    BEGIN
        -- DO STUFF HERE 
    END
    EXEC @result = sp_releaseapplock @Resource = 'YOUR_uniqueidentifier_HERE'  
    
    COMMIT TRAN
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-31
      • 2020-05-27
      • 2011-01-06
      • 1970-01-01
      • 1970-01-01
      • 2018-05-23
      相关资源
      最近更新 更多