sql >> Databáze >  >> RDS >> Sqlserver

Použití databázové tabulky jako fronty

Použil bych pole IDENTITY jako primární klíč k poskytnutí jedinečně se zvyšujícího ID pro každou položku ve frontě a nalepil bych na něj seskupený index. To by představovalo pořadí, ve kterém byly položky zařazeny do fronty.

Chcete-li položky ponechat v tabulce fronty, když je zpracováváte, budete potřebovat pole „stav“ označující aktuální stav konkrétní položky (např. 0=čeká, 1=zpracovává se, 2=zpracovává se). To je nutné, aby se zabránilo dvojímu zpracování položky.

Při zpracovávání položek ve frontě byste museli najít další položku v tabulce, která se aktuálně nezpracovává. To by muselo být provedeno takovým způsobem, aby se zabránilo tomu, že několik procesů zvedne stejnou položku ke zpracování ve stejnou dobu, jak je ukázáno níže. Všimněte si nápovědy k tabulce UPDLOCK a READPAST, kterých byste si měli být vědomi při implementaci front.

např. v rámci sproc, něco takového:

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

Pokud se zpracování položky nezdaří, chcete mít možnost to zkusit znovu později? Pokud ano, budete muset buď resetovat stav zpět na 0 nebo tak něco. To bude vyžadovat více úvah.

Alternativně nepoužívejte jako frontu databázovou tabulku, ale něco jako MSMQ – jen mě napadlo, že to do toho dám!



  1. Aktualizujte více řádků v jednom dotazu MySQL

  2. Vložte obrázek do databáze

  3. Ztraceno v datech a časových pásmech

  4. Nainstalovaný MacPorts PHP, nyní nemůže komunikovat s MySQL - Mac OS X