Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Ten prosty kod powoduje zakleszczenie. Zawiera prosty przykładowy program

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server odpowiednik typu danych wyliczenia MySQL?

  2. Jak zapętlić i przeanalizować parametr xml w procedurze składowanej serwera sql?

  3. IS NULL w porównaniu z <> 1 bitem SQL

  4. ORDER BY z opisem przypadku DESC

  5. Zapytanie SQL do konwersji formatu daty na inny