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:
- Zmień odpowiednie
CommandTimeout
do 0 (tj. nieskończoność). - Włącz
blocked process threshold
, ustaw go na 30 sekund (poprzednio CommandTimeout) - Monitoruj w programie Profiler pod kątem Zdarzenie raportu o zablokowanym procesie
- Rozpocznij pracę
- 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ść.