Edycja:
Wygooglowałem, aby sprawdzić moją odpowiedź:„Przetwarzanie kolejek danych w SQL Server z READPAST i UPDLOCK”. Minęły lata, odkąd czytałem i bawiłem się tym rozwiązaniem.
Oryginał:
Jeśli użyjesz wskazówki READPAST, zablokowane wiersze zostaną pominięte. Użyłeś ROWLOCK, więc powinieneś unikać eskalacji blokady. Potrzebujesz również UPDLOCK, jak się dowiedziałem.
Tak więc proces 1 blokuje 20 wierszy, proces 2 zajmuje kolejne 20, proces 3 zajmuje wiersze od 41 do 60 itd.
Aktualizację można również napisać w następujący sposób:
UPDATE TOP (20)
foo
SET
ProcessorID = @PROCID
FROM
OrderTable foo WITH (ROWLOCK, READPAST, UPDLOCK)
WHERE
ProcessorID = 0
Odśwież, październik 2011
Można to zrobić bardziej elegancko za pomocą klauzuli OUTPUT, jeśli potrzebujesz SELECT i UPDATE za jednym razem.