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

Jak se zbavit zablokování v aplikaci SQL Server 2005 a C#?

Ve vašem kódu nevidím žádný explicitní rozsah transakcí, takže nevím, jaké zámky jsou již na místě, když provádíte aktualizaci; také není jasné, jakou úroveň izolace používáte. Nejběžnějším scénářem v tomto typu situace je však to, že dříve ve stejné transakci jste zadali výběr (zámek čtení) na stejné řádky, které se pokoušíte aktualizovat později. To způsobí eskalaci zámku a může vést k uváznutí, pokud se dvě transakce pokoušejí udělat totéž:

  1. Transakce A:vyberte se zámkem čtení
  2. Transakce B:vyberte se zámkem čtení
  3. Transakce A:aktualizace – chce eskalovat svůj zámek čtení na zámek zápisu, ale musí počkat, až transakce B uvolní zámek čtení
  4. Transakce B:aktualizace – chce eskalovat svůj zámek čtení na zámek zápisu, ale musí počkat, až transakce A uvolní zámek čtení.

Bingo! uváznutí, protože A i B na sebe čekají, aby uvolnily své stávající zámky čtení, než budou moci provést aktualizaci.

Abyste tomu zabránili, potřebujete ve svém výběru nápovědu pro updlock, např.

select * from table with (updlock) where blah blah

Tím zajistíte, že váš výběr použije zámek pro zápis místo zámku pro čtení, což zabrání eskalaci zámku mezi souběžnými transakcemi.



  1. MySQL od řádku ke sloupci

  2. Co je špatného na mém příkazu MySQL?

  3. Počet a seskupení MySQL po dnech

  4. Oracle:Jak zjistit ukončení klientského procesu, jako to funguje pro sqlplus?