sql >> Database teknologi >  >> RDS >> Sqlserver

Brug af en databasetabel som en kø

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!



  1. Kan jeg returnere værdier til PHP fra en anonym PL/SQL-blok?

  2. Sådan konfigureres automatisk failover for Moodle MySQL-databasen

  3. To PLSQL-sætninger med start og slut, kører fint hver for sig, men ikke sammen?

  4. Autorollback i postgres ved hjælp af PDO