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!