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

Jak pozbyć się zakleszczenia w aplikacji SQL Server 2005 i C#?

Nie widzę żadnego wyraźnego zakresu transakcji w twoim kodzie, więc nie wiem, jakie blokady są już na miejscu podczas aktualizacji; również nie jest jasne, jakiego poziomu izolacji używasz. Ale najczęstszym scenariuszem w tego typu sytuacji jest to, że wcześniej w tej samej transakcji wystawiłeś (blokadę odczytu) na te same wiersze, które próbujesz później zaktualizować. Spowoduje to eskalację blokady i może spowodować zakleszczenie, jeśli dwie transakcje próbują zrobić to samo:

  1. Transakcja A:wybierz z blokadą odczytu
  2. Transakcja B:wybierz z readlockiem
  3. Transakcja A:aktualizacja - chce eskalować blokadę odczytu do blokady zapisu, ale musi czekać, aż transakcja B zwolni blokadę odczytu
  4. Transakcja B:aktualizacja - chce eskalować blokadę odczytu do blokady zapisu, ale musi czekać, aż transakcja A zwolni blokadę odczytu.

Bingo! zakleszczenie, ponieważ zarówno A, jak i B czekają na siebie, aby zwolnić istniejące blokady odczytu, zanim będą mogli wykonać aktualizację.

Aby temu zapobiec, potrzebujesz podpowiedzi w wyborze, np.

select * from table with (updlock) where blah blah

Zapewni to, że twój wybór użyje blokady zapisu zamiast blokady odczytu, co zapobiegnie eskalacji blokady między równoczesnymi transakcjami.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wyzwalacz SQL Server wstawia wartości z nowego wiersza do innej tabeli

  2. Wstawianie danych SQL Server do Salesforce.com

  3. Sposoby przechowywania historii danych w bazie danych SQL Server 2008

  4. Kiedy wydajność Distinct i Group By jest inna?

  5. Znajdź znaki spoza zestawu ASCII w kolumnach varchar za pomocą SQL Server