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

Czasami pojawia się wyjątek SqlException:upłynął limit czasu

Musisz to zbadać po stronie serwera, aby zrozumieć, dlaczego upłynął limit czasu wykonania. Zauważ, że serwer nie ma limitu czasu, limit czasu jest spowodowany przez domyślne 30 sekund na SqlCommand.CommandTimeout .

Dobrym źródłem informacji jest Oczekiwania i kolejki , która jest metodologią diagnozowania wąskich gardeł wydajności w programie SQL Server. W oparciu o rzeczywistą przyczynę przekroczenia limitu czasu można podjąć odpowiednie działania. Musisz przede wszystkim ustalić, czy masz do czynienia z powolnym wykonaniem (zły plan), czy z blokowaniem.

Gdybym zaryzykował, powiedziałbym, że niezdrowy wzorzec IF EXISTS... UPDATE jest główną przyczyną. Ten wzorzec jest niepoprawny i spowoduje awarie w ramach współbieżności. Dwie równoczesne transakcje wykonujące IF EXISTS jednocześnie obaj dojdą do tego samego wniosku i oba próba INSERT lub UPDATE . W zależności od istniejących ograniczeń w bazie danych, możesz skończyć z impasem (szczęśliwy przypadek) lub utraconym zapisem (nieszczęśliwy przypadek). Jednak tylko właściwe badanie ujawniłoby faktyczną przyczynę. Może to być coś zupełnie innego, na przykład zdarzenia automatycznego wzrostu .

Twoja procedura również nieprawidłowo obsługuje blok CATCH. Musisz zawsze sprawdź XACT_STATE() ponieważ transakcja może być już wycofana do czasu uruchomienia bloku CATCH. Nie jest również jasne, czego oczekujesz od nazywania transakcji, jest to częsty błąd, który widzę często związany z myleniem nazwanych transakcji z punktami zapisu. Aby uzyskać poprawny wzorzec, zobacz Obsługa wyjątków i transakcje zagnieżdżone .

Edytuj

Oto możliwy sposób sprawdzenia tego:

  1. Zmień odpowiednie CommandTimeout do 0 (tj. nieskończoność).
  2. Włącz blocked process threshold , ustaw go na 30 sekund (poprzednio CommandTimeout)
  3. Monitoruj w programie Profiler pod kątem Zdarzenie raportu o zablokowanym procesie
  4. Rozpocznij pracę
  5. Sprawdź, czy Profiler generuje jakiekolwiek zdarzenia raportu. Jeśli tak, wskażą przyczynę.

Te działania spowodują zdarzenie „raport o zablokowanym procesie” za każdym razem, gdy zostanie przekroczony limit czasu, jeśli limit czasu został spowodowany przez zablokowanie. Twoja aplikacja będzie nadal czekać, aż blokada zostanie usunięta, jeśli zablokowanie jest spowodowane przez live-lock wtedy będzie czekać w nieskończoność.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Znajdowanie zduplikowanych wierszy w SQL Server

  2. Jak mogę wykonać żądanie HTTP z serwera SQL?

  3. Sql Server ciąg do konwersji daty

  4. LINQ to SQL Take bez pomijania powoduje wiele instrukcji SQL

  5. Zapytanie SQL „LIKE” przy użyciu „%”, gdzie kryteria wyszukiwania zawierają „%”