我想使用数据库表创建一些分布式互斥。在存储过程上有以下接口会很好:
等待(唯一标识符)
我最初是想通过一个唯一标识符表来实现这一点。对该过程的调用将一直等到表中不存在唯一标识符。但是,我不确定当从表中删除指定的唯一标识符时如何使调用线程唤醒。
有任何想法吗?如果数据库不是执行此操作的正确位置,是否有任何第三方工具可以工作(最好是开源的)?
(为了避免死锁,我要么想在等待操作中包含一个超时,要么让 SqlCommand 有一个超时)
我想使用数据库表创建一些分布式互斥。在存储过程上有以下接口会很好:
等待(唯一标识符)
我最初是想通过一个唯一标识符表来实现这一点。对该过程的调用将一直等到表中不存在唯一标识符。但是,我不确定当从表中删除指定的唯一标识符时如何使调用线程唤醒。
有任何想法吗?如果数据库不是执行此操作的正确位置,是否有任何第三方工具可以工作(最好是开源的)?
(为了避免死锁,我要么想在等待操作中包含一个超时,要么让 SqlCommand 有一个超时)
看一下系统存储过程:
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