Jeg ville bruge et IDENTITET-felt som den primære nøgle til at give det unikt stigende ID for hvert element i kø og sætte et klynget indeks på det. Dette ville repræsentere den rækkefølge, som varerne blev sat i kø.
For at beholde varerne i køtabellen, mens du behandler dem, skal du bruge et "status"-felt for at angive den aktuelle status for en bestemt vare (f.eks. 0=venter, 1=behandles, 2=behandles). Dette er nødvendigt for at forhindre, at en vare behandles to gange.
Når du behandler varer i køen, skal du finde det næste element i tabellen, der IKKE behandles i øjeblikket. Dette skal være på en sådan måde, at det forhindres, at flere processer henter den samme vare til behandling på samme tid som vist nedenfor. Bemærk tabeltip UPDLOCK og READPAST, som du skal være opmærksom på, når du implementerer køer.
for eksempel. inden for en sproc, noget som dette:
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
Hvis behandlingen af en vare mislykkes, vil du så være i stand til at prøve den igen senere? Hvis det er tilfældet, skal du enten nulstille statussen tilbage til 0 eller noget. Det vil kræve mere omtanke.
Alternativt skal du ikke bruge en databasetabel som en kø, men noget som MSMQ - tænkte bare, at jeg ville smide det i blandingen!