sql >> Databáze >  >> RDS >> Sqlserver

SQL Server Process Queue Race Condition

Upravit:

Vygooglil jsem, abych zkontroloval svou odpověď:„Zpracování datových front na serveru SQL pomocí READPAST a UPDLOCK“. Už jsou to roky, co jsem o tomto řešení četl a hrál si s ním.

Originál:

Pokud použijete nápovědu READPAST, budou zamčené řádky přeskočeny. Použili jste ROWLOCK, takže byste se měli vyhnout eskalaci zámku. Potřebujete také UPDLOCK, jak jsem zjistil.

Proces 1 tedy zamkne 20 řádků, proces 2 zabere dalších 20, proces 3 zabere řádky 41 až 60 atd

Aktualizaci lze také napsat takto:

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

Aktualizace, říjen 2011

Toho lze dosáhnout elegantněji pomocí klauzule OUTPUT, pokud potřebujete najednou SELECT a UPDATE.



  1. Jak řešit problémy s definicí MySQL

  2. Úplný seznam znakových sad podporovaných MariaDB

  3. Výjimka Java JDBC MySQL:Operace není povolena po uzavření ResultSet

  4. Jak vložit aktualizovatelný záznam se sloupcem JSON v PostgreSQL pomocí JOOQ?