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

UPDATE + WITH (ROWLOCK) + CTE

NOLOCK se nevztahuje na část dotazu, která odkazuje na tabulku, která má být upravena. V příkazech aktualizace SQL Serveru krátce uzamkněte každý řádek, když je testován. Toto je mechanismus vyhýbání se uváznutí. Zabraňuje více aktualizacím každého S-lock řádku pro čtení a poté se pokusí jej X-uzamknout.

Nemůžete nechat U-zámky zmizet AFAIK. Ale můžete snížit počet řádků uzamčených ve tvaru písmene U na úplné minimum vlastním spojením:

update t1
set ...
from T t1 with (rowlock)
where t1.ID in (select TOP 5 ID from T t2 with (nolock) where ... order by ...)

To zvyšuje trochu režie, ale umožňuje vám to použít NOLOCK ke čtení.

Zvažte použití izolace snímků pro čtení. NOLOCK má určité problémy, jako jsou dotazy, které se náhodně přerušují.




  1. Jak posunout hodnoty sloupců v MySQL?

  2. Znovu použít parametr v PreparedStatement?

  3. MySQL:vyberte 5 řádků před a za konkrétním řádkem

  4. Rotační/kontingenční tabulka s agregací v Oracle