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éž:
- Transakce A:vyberte se zámkem čtení
- Transakce B:vyberte se zámkem čtení
- 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í
- 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.