Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Condição de corrida da fila de processos do SQL Server


Editar:

Eu pesquisei para verificar minha resposta:"Processando filas de dados no SQL Server com READPAST e UPDLOCK". Já faz anos desde que li e brinquei com essa solução.

Original:

Se você usar a dica READPAST, as linhas bloqueadas serão ignoradas. Você usou o ROWLOCK, portanto, evite o escalonamento de bloqueio. Você também precisa do UPDLOCK, como descobri.

Portanto, o processo 1 bloqueia 20 linhas, o processo 2 leva as próximas 20, o processo 3 as linhas 41 a 60, etc.

A atualização também pode ser escrita assim:
UPDATE TOP (20)
    foo
SET
    ProcessorID = @PROCID
FROM
    OrderTable foo WITH (ROWLOCK, READPAST, UPDLOCK)
WHERE
    ProcessorID = 0

Atualizar, outubro de 2011

Isso pode ser feito de forma mais elegante com a cláusula OUTPUT se você precisar de um SELECT e um UPDATE de uma só vez.