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

Uso de una tabla de base de datos como una cola

Usaría un campo de IDENTIDAD como la clave principal para proporcionar la identificación de incremento único para cada elemento en cola, y pegaría un índice agrupado en él. Esto representaría el orden en que se pusieron en cola los elementos.

Para mantener los elementos en la tabla de la cola mientras los procesa, necesitará un campo de "estado" para indicar el estado actual de un elemento en particular (por ejemplo, 0 =esperando, 1 =en proceso, 2 =procesado). Esto es necesario para evitar que un artículo se procese dos veces.

Al procesar elementos en la cola, debe encontrar el siguiente elemento en la tabla que NO se está procesando actualmente. Esto debería ser de tal manera que se evite que varios procesos recojan el mismo elemento para procesarlo al mismo tiempo, como se demuestra a continuación. Tenga en cuenta las sugerencias de tabla UPDLOCK y READPAST que debe tener en cuenta al implementar colas.

p.ej. dentro de un sproc, algo como esto:

DECLARE @NextID INTEGER

BEGIN TRANSACTION

-- Find the next queued item that is waiting to be processed
SELECT TOP 1 @NextID = ID
FROM MyQueueTable WITH (UPDLOCK, READPAST)
WHERE StateField = 0
ORDER BY ID ASC

-- if we've found one, mark it as being processed
IF @NextId IS NOT NULL
    UPDATE MyQueueTable SET Status = 1 WHERE ID = @NextId

COMMIT TRANSACTION

-- If we've got an item from the queue, return to whatever is going to process it
IF @NextId IS NOT NULL
    SELECT * FROM MyQueueTable WHERE ID = @NextID

Si falla el procesamiento de un elemento, ¿desea poder volver a intentarlo más tarde? Si es así, deberá restablecer el estado a 0 o algo así. Eso requerirá más reflexión.

Alternativamente, no use una tabla de base de datos como una cola, sino algo como MSMQ, ¡solo pensé en incluir eso en la mezcla!