Bewerken:
Ik googelde om mijn antwoord te controleren:"Verwerking van gegevenswachtrijen in SQL Server met READPAST en UPDLOCK". Het is jaren geleden dat ik over deze oplossing heb gelezen en ermee heb gespeeld.
Origineel:
Als u de READPAST-hint gebruikt, worden vergrendelde rijen overgeslagen. Je hebt ROWLOCK gebruikt, dus je moet escalatie van de vergrendeling vermijden. Je hebt ook UPDLOCK nodig, zoals ik ontdekte.
Dus proces 1 vergrendelt 20 rijen, proces 2 neemt de volgende 20, proces 3 neemt rijen 41 tot 60, enz.
De update kan ook als volgt worden geschreven:
UPDATE TOP (20)
foo
SET
ProcessorID = @PROCID
FROM
OrderTable foo WITH (ROWLOCK, READPAST, UPDLOCK)
WHERE
ProcessorID = 0
Vernieuwen, okt 2011
Dit kan eleganter met de OUTPUT-clausule als je een SELECT en een UPDATE in één keer nodig hebt.