sql >> Base de Datos >  >> RDS >> Sqlserver

Condición de carrera de cola de proceso de SQL Server

Editar:

Busqué en Google para verificar mi respuesta:"Procesamiento de colas de datos en SQL Server con READPAST y UPDLOCK". Han pasado años desde que leí y jugué con esta solución.

Originales:

Si usa la sugerencia READPAST, las filas bloqueadas se omiten. Ha utilizado ROWLOCK, por lo que debe evitar la escalada de bloqueo. También necesitas UPDLOCK, como descubrí.

Entonces, el proceso 1 bloquea 20 filas, el proceso 2 tomará las siguientes 20, el proceso 3 tomará las filas 41 a 60, etc.

La actualización también se puede escribir así:

UPDATE TOP (20)
    foo
SET
    ProcessorID = @PROCID
FROM
    OrderTable foo WITH (ROWLOCK, READPAST, UPDLOCK)
WHERE
    ProcessorID = 0

Actualizar, octubre de 2011

Esto se puede hacer de manera más elegante con la cláusula OUTPUT si necesita SELECCIONAR y ACTUALIZAR de una sola vez.