Modifier :
J'ai cherché sur Google pour vérifier ma réponse :"Traitement des files d'attente de données dans SQL Server avec READPAST et UPDLOCK". Cela fait des années que je n'ai pas lu et joué avec cette solution.
Original :
Si vous utilisez l'indicateur READPAST, les lignes verrouillées sont ignorées. Vous avez utilisé ROWLOCK, vous devez donc éviter l'escalade des verrous. Vous avez également besoin de UPDLOCK, comme je l'ai découvert.
Ainsi, le processus 1 verrouille 20 lignes, le processus 2 prend les 20 suivantes, le processus 3 prend les lignes 41 à 60, etc
La mise à jour peut également être écrite comme ceci :
UPDATE TOP (20)
foo
SET
ProcessorID = @PROCID
FROM
OrderTable foo WITH (ROWLOCK, READPAST, UPDLOCK)
WHERE
ProcessorID = 0
Actualisation, octobre 2011
Cela peut être fait de manière plus élégante avec la clause OUTPUT si vous avez besoin d'un SELECT et d'un UPDATE en une seule fois.