3

データベース テーブルを使用して分散相互排除を作成したいと考えています。ストアド プロシージャに次のインターフェイスがあると便利です。

Wait(一意の識別子)

私はもともと、一意の識別子のテーブルを持つことでこれを実装することを考えていました。プロシージャーの呼び出しは、固有 ID がテーブルに存在しなくなるまで待機します。ただし、指定された一意の識別子がテーブルから削除されたときに、呼び出し元のスレッドを起動する方法がわかりません。

何か案は?データベースがこれを行うのに適切な場所ではない場合、動作するサードパーティのツールはありますか (できればオープンソース)?

(デッドロックを回避するために、待機操作にタイムアウトを含めるか、SqlCommand にタイムアウトを持たせたい)

4

1 に答える 1

4

システム ストアド プロシージャを見てみましょう。

 sp_getapplock

あなたがやろうとしていることを達成するのに役立つかもしれません。

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

uniqueidentifier をパラメータ化する proc に入れることができます...

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
于 2009-04-01T19:10:59.863 に答える