Mutex Stored Procedure
-
22-08-2019 - |
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)
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