c# sql-server concurrency distributed mutual-exclusion

c# - Procedimiento almacenado mutex



sql-server concurrency (1)

Quiero crear una exclusión mutua distribuida usando una tabla de base de datos. Sería bueno tener la siguiente interfaz en un procedimiento almacenado:

Wait (uniqueidentifier)

Originalmente estaba pensando en implementar esto teniendo una tabla de identificadores únicos. Una llamada al procedimiento esperaría hasta que el identificador único no exista en la tabla. Sin embargo, no estoy seguro de cómo haría que el hilo de llamada se active cuando se eliminó el identificador único especificado de la tabla.

¿Algunas ideas? Si la base de datos no es el lugar correcto para hacerlo, ¿hay alguna herramienta de terceros que funcione (preferiblemente de código abierto)?

(Para evitar interbloqueos, o quiero incluir un tiempo de espera en la operación de espera o hacer que el SqlCommand tenga un tiempo de espera excedido)


Eche un vistazo al procedimiento almacenado del sistema:

sp_getapplock

Puede ayudarte a lograr lo que estás tratando de hacer.

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

Puedes ponerlo en un proceso que parametrice el identificador único ...

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