SQL Server File d'attente des Processus Condition de Course
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 de l'enregistrement de à 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.
De façon Explicite - 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
Vous devez vous connecter pour publier un commentaire.
Edit:
J'ai googlé pour vérifier ma réponse: "Le traitement des Files d'attente de Données dans SQL Server avec READPAST et UPDLOCK". Cela fait des années depuis que j'ai lu et joué avec cette solution.
Original:
Si vous utilisez l'indicateur READPAST, puis verrouillé lignes sont ignorés. Vous avez utilisé le VERROU de sorte que vous devriez éviter l'escalade de verrous. Vous avez également besoin d'UPDLOCK, que j'ai trouvé.
Donc 1 verrous de 20 lignes, processus 2 va passer à la prochaine 20, processus 3 prend les lignes 41 à 60, etc
La mise à jour peut aussi être écrit comme ceci:
D'Actualisation, Oct 2011
Cela peut être fait de manière plus élégante avec la SORTIE de la clause si vous avez besoin d'une sélection et une mise à JOUR d'un seul coup.
UPDLOCK
allusion à laUPDATE
déclaration de forcer la mise à jour des verrous (à la place des verrous partagés), tandis que lecture les lignes à mettre à jour? En d'autres termes, si vous n'utilisez pasUPDLOCK
, est-il possible pour une course à condition d'exister et deux mise à jour des déclarations de sélectionner les mêmes lignes?Vous pouvez utiliser les Services d'un Courtier. Vous pouvez également utiliser sp_getapplock de sérialiser l'accès à vos lignes - qui permettra d'éliminer les conditions de course:
"Aider la concurrence en créant votre propre cadenas (Mutexs dans SQL)"
http://sqlblogcasts.com/blogs/tonyrogerson/archive/2006/06/30/855.aspx