Redigera:
Jag googlade för att kontrollera mitt svar:"Bearbetar dataköer i SQL Server med READPAST och UPDLOCK". Det har gått år sedan jag läste om och lekte med den här lösningen.
Original:
Om du använder READPAST-tipset hoppas du över låsta rader. Du har använt ROWLOCK så du bör undvika låseskalering. Du behöver också UPDLOCK, som jag fick reda på.
Så process 1 låser 20 rader, process 2 tar nästa 20, process 3 tar rader 41 till 60 osv.
Uppdateringen kan också skrivas så här:
UPDATE TOP (20)
foo
SET
ProcessorID = @PROCID
FROM
OrderTable foo WITH (ROWLOCK, READPAST, UPDLOCK)
WHERE
ProcessorID = 0
Uppdatera, okt 2011
Detta kan göras mer elegant med OUTPUT-satsen om du behöver en SELECT och en UPPDATERING på en gång.