Pergunta

Eu quero criar alguma exclusão mútua distribuída usando uma tabela de banco de dados. Seria bom ter a seguinte interface em um procedimento armazenado:

Wait (uniqueidentifier) ??

Eu estava originalmente pensando em implementar isso por ter uma tabela de identificadores únicos. Uma chamada para o procedimento iria esperar até que o identificador único não existe na tabela. No entanto, eu não sei como eu faria o segmento de chamada acordar quando o identificador único especificado foi removido da tabela.

Todas as idéias? Se o banco de dados não é o lugar certo para fazer isso, existem ferramentas de terceiros que iria trabalhar (open source de preferência)?

(Para impasses evitar, ou eu querer incluir um tempo limite na operação de espera ou ter o SqlCommand tem um tempo limite)

Foi útil?

Solução

Dê uma olhada no procedimento armazenado do sistema:

 sp_getapplock

Pode ajudá-lo a realizar o que você está tentando fazer.

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

Você pode colocá-lo em um proc que parametriza o uniqueidentifier ...

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top