Vaše dva příkazy získávají zámky řádků v různém pořadí. To je klasický případ zablokování. Můžete to opravit tím, že zajistíte, aby pořadí přijatých zámků bylo vždy v nějakém globálním pořadí (například seřazeno podle ID). Pravděpodobně byste měli spojit dva UPDATE
příkazy do jednoho a seřadit seznam ID na klientovi před jeho odesláním na SQL Server. Pro mnohé typické UPDATE
plánů to ve skutečnosti funguje dobře (není však zaručeno).
Nebo přidáte logiku opakování pro případ, že zjistíte uváznutí (SqlException.Number == 1205
). To je elegantnější, protože nevyžaduje žádné hlubší změny kódu. Ale zablokování má vliv na výkon, takže to dělejte pouze při nízké míře uváznutí.
Pokud vaše paralelní zpracování generuje mnoho aktualizací, můžete INSERT
všechny tyto aktualizace do dočasné tabulky (které lze provést souběžně) a po dokončení provedete jednu velkou UPDATE
který zkopíruje všechny jednotlivé aktualizační záznamy do hlavní tabulky. Stačí změnit zdroj spojení ve svých ukázkových dotazech.