Twoje dwie instrukcje uzyskują blokady wierszy w różnej kolejności. To klasyczny przypadek zakleszczenia. Możesz to naprawić, upewniając się, że kolejność podejmowanych blokad jest zawsze w jakimś porządku globalnym (na przykład według identyfikatora). Prawdopodobnie powinieneś połączyć dwa UPDATE
instrukcji w jedną i posortuj listę identyfikatorów na kliencie przed wysłaniem jej do SQL Server. Dla wielu typowych UPDATE
plany, to faktycznie działa dobrze (choć nie jest to gwarantowane).
Lub dodaj logikę ponawiania prób w przypadku wykrycia zakleszczenia (SqlException.Number == 1205
). Jest to bardziej eleganckie, ponieważ nie wymaga głębszych zmian w kodzie. Jednak zakleszczenia mają wpływ na wydajność, więc rób to tylko w przypadku niskich wskaźników zakleszczeń.
Jeśli przetwarzanie równoległe generuje wiele aktualizacji, możesz INSERT
wszystkie te aktualizacje do tabeli tymczasowej (które można wykonać jednocześnie), a kiedy skończysz, wykonujesz jedną dużą UPDATE
kopiuje wszystkie indywidualne rekordy aktualizacji do tabeli głównej. Po prostu zmieniasz źródło złączenia w przykładowych zapytaniach.