sql >> Database >  >> RDS >> Sqlserver

SQL Server Process Queue Race Conditie

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.



  1. Hele DataTable in één keer in de database invoegen in plaats van rij voor rij?

  2. Maak een Database Mail Account (SSMS)

  3. Implementeer SQL Server AlwaysOn-beschikbaarheidsgroepen op Linux

  4. Strings splitsen:nu met minder T-SQL