Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Condizione di competizione della coda di processo di SQL Server

Modifica:

Ho cercato su Google per controllare la mia risposta:"Elaborazione delle code di dati in SQL Server con READPAST e UPDLOCK". Sono passati anni da quando ho letto e giocato con questa soluzione.

Originale:

Se si utilizza l'hint READPAST, le righe bloccate vengono ignorate. Hai utilizzato ROWLOCK, quindi dovresti evitare l'escalation del blocco. Hai anche bisogno di UPDLOCK, come ho scoperto.

Quindi il processo 1 blocca 20 righe, il processo 2 prenderà le 20 successive, il processo 3 prenderà le righe da 41 a 60, ecc

L'aggiornamento può anche essere scritto così:

UPDATE TOP (20)
    foo
SET
    ProcessorID = @PROCID
FROM
    OrderTable foo WITH (ROWLOCK, READPAST, UPDLOCK)
WHERE
    ProcessorID = 0

Aggiornamento, ottobre 2011

Questo può essere fatto in modo più elegante con la clausola OUTPUT se hai bisogno di SELECT e UPDATE in una volta sola.