Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Utilisation d'une table de base de données comme file d'attente

J'utiliserais un champ IDENTITY comme clé primaire pour fournir l'ID d'incrémentation unique pour chaque élément en file d'attente, et y coller un index clusterisé. Cela représenterait l'ordre dans lequel les éléments ont été mis en file d'attente.

Pour conserver les éléments dans la table de file d'attente pendant que vous les traitez, vous avez besoin d'un champ "statut" pour indiquer l'état actuel d'un élément particulier (par exemple, 0=en attente, 1=en cours de traitement, 2=traité). Ceci est nécessaire pour éviter qu'un élément soit traité deux fois.

Lors du traitement des éléments de la file d'attente, vous devez rechercher l'élément suivant dans la table qui n'est PAS en cours de traitement. Cela devrait être fait de manière à empêcher plusieurs processus de récupérer le même élément à traiter en même temps, comme illustré ci-dessous. Notez les conseils de table UPDLOCK et READPAST dont vous devez être conscient lors de la mise en œuvre des files d'attente.

par exemple. dans un sproc, quelque chose comme ceci :

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 le traitement d'un élément échoue, voulez-vous pouvoir réessayer plus tard ? Si tel est le cas, vous devrez soit réinitialiser le statut à 0, soit quelque chose du genre. Cela demandera plus de réflexion.

Sinon, n'utilisez pas une table de base de données comme file d'attente, mais quelque chose comme MSMQ - j'ai juste pensé que je mettrais ça dans le mélange !