2009-04-01 6 views
3

Ich möchte einige verteilte gegenseitige Ausschluss mithilfe einer Datenbanktabelle erstellen. Es wäre schön, die folgende Schnittstelle für eine gespeicherte Prozedur zu haben:Mutex Stored Procedure

Wait (unique)

ich ursprünglich dachte, dies zu implementieren, indem eine Tabelle mit eindeutigen Kennungen aufweisen. Ein Aufruf der Prozedur würde warten, bis der eindeutige Bezeichner in der Tabelle nicht mehr existiert. Ich bin mir jedoch nicht sicher, wie ich den aufrufenden Thread aufwecken würde, wenn der angegebene eindeutige Bezeichner aus der Tabelle entfernt wurde.

Irgendwelche Ideen? Wenn die Datenbank nicht der richtige Ort dafür ist, gibt es irgendwelche Tools von Drittanbietern, die funktionieren würden (vorzugsweise Open Source)?

(Deadlocks zu vermeiden, ich entweder wollen ein Timeout in der Warteoperation aufzunehmen oder die SqlCommand haben haben ein Timeout)

Antwort

4

im System gespeicherte Prozedur Werfen Sie einen Blick:

sp_getapplock 

Es kann Ihnen helfen, das zu erreichen, was Sie zu tun versuchen.

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

Sie es in einem proc setzen können, das die Unique parametrisiert ...

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