互斥存储过程

时间:2009-04-01 19:06:41

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

我想使用数据库表创建一些分布式互斥。在存储过程上使用以下接口会很好:

等待(唯一标识符)

我原本打算通过拥有唯一标识符表来实现这一点。对过程的调用将等待,直到表中不存在唯一标识符。但是,当我从表中删除指定的唯一标识符时,我不确定如何唤醒调用线程。

有什么想法吗?如果数据库不是正确的地方,是否有任何第三方工具可以使用(最好是开源)?

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

1 个答案:

答案 0 :(得分:4)

看一下系统存储过程:

 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