互斥锁存储过程

3
我希望使用数据库表创建一些分布式互斥。最好在存储过程上有以下接口:
Wait(uniqueidentifier)
我最初的想法是通过拥有唯一标识符的表来实现这一点。调用该过程将等待,直到唯一标识符不存在于表中。然而,我不确定如何使调用线程在指定的唯一标识符从表中删除时唤醒。
有什么想法吗?如果数据库不是执行此操作的正确位置,是否有任何第三方工具可用(最好是开源的)?
(为避免死锁,在等待操作中要么包含超时,要么SqlCommand具有超时)
1个回答

4

看一下系统存储过程:

 sp_getapplock

这可能有助于您完成您想要做的事情。

http://msdn.microsoft.com/zh-cn/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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接