Tengo muchos procesos .NET leyendo mensajes de una tabla SQL Server 2008 DB y procesándolos de uno en uno. Implemento un SP simple para 'bloquear' la fila que está siendo leída por cualquier proceso, para evitar que dos procesos procesen la misma fila.Bloquear una fila de lecturas mientras se ejecuta sp
BEGIN TRAN
SELECT @status = status FROM t WHERE t.id = @id
IF @status = 'L'
BEGIN
-- Already locked by another process. Skip this
RETURN 0
END
ELSE
UPDATE t SET status = 'L' WHERE id = @id
RETURN 1
END
COMMIT
Sin embargo, esto tiene defectos: a veces una fila se 'bloquea' y procesa dos veces. Sospecho que hay un problema de concurrencia: dos procesos que leen el estado antes de que uno lo actualice.
Creo que esto podría resolverse implementando un bloque de lectura de alguna manera (es decir, hacer que la transacción bloquee READ), pero no estoy seguro de cómo hacerlo. ¿Alguien puede ayudar?
Gracias mucho por adelantado
Ryan
Debo agregar que los procesos son procesos .NET separados, no una ejecución única de subprocesos múltiples, por lo que esto no se puede resolver a un nivel de programación C#. – Ryan