J'ai un ordre de la file d'attente qui est accessible par plusieurs processeurs moyen d'une procédure stockée. Chaque processeur passe dans un ID unique qui est utilisé pour verrouiller les 20 prochaines commandes pour son propre usage. La procédure stockée renvoie alors ces dossiers à l'ordre du processeur à l'ordre du jour.
Il y a des cas où plusieurs processeurs sont en mesure de récupérer la même "OrderTable' enregistrement à quel point ils essayent de les opérer sur elle. Cette situation entraîne des erreurs en cours de levée plus tard dans le processus.
Mon prochain cours de l'action est de permettre à chaque processeur de saisir toutes les commandes disponibles et tout autour de robin des processeurs, mais j'espérais tout simplement faire de cette section de code thread-safe et permettre aux établissements de transformation de saisir des enregistrements à chaque fois que qu'ils aiment.
Donc Explicitement - une idée de pourquoi je suis en train de vivre cette "race condition" et comment je peux résoudre le problème.
BEGIN TRAN
UPDATE OrderTable WITH ( ROWLOCK )
SET ProcessorID = @PROCID
WHERE OrderID IN ( SELECT TOP ( 20 )
OrderID
FROM OrderTable WITH ( ROWLOCK )
WHERE ProcessorID = 0)
COMMIT TRAN
SELECT OrderID, ProcessorID, etc...
FROM OrderTable
WHERE ProcessorID = @PROCID