Jaki jest dobry sposób, aby przechowywane procesory były wystarczająco solidne, aby mogły bardzo dobrze skalować, a także zawierać obsługę błędów?
Ponadto, jaki jest najlepszy sposób radzenia sobie z wieloma scenariuszami błędów w przechowywanym proc i posiadania inteligentnego systemu informacji zwrotnej, który zwróci istotne informacje o błędach do aplikacji wywołujących?
Odpowiedzi:
Alex Kuznetsov ma świetny rozdział w swojej książce Defensive Database Programming (rozdział 8), który obejmuje T-SQL TRY ... CATCH, transakcje T-SQL i ustawienia SET XACT_ABORT oraz korzystanie z obsługi błędów po stronie klienta. Pomoże ci to w podjęciu decyzji, która z opcji ma największy sens w tym, co musisz osiągnąć.
Jest dostępny za darmo na tej stronie . Nie jestem w żaden sposób związany z firmą, ale posiadam wersję papierową tej książki.
Istnieje wiele drobnych szczegółów na ten temat, które Alex bardzo dobrze wyjaśnia.
Na prośbę Nicka ... (ale nie wszystko to znajduje się w rozdziale)
Jeśli chodzi o skalowanie, musisz być brutalnie uczciwy w kwestii tego, które działania muszą znajdować się w kodzie db, a które w aplikacji. Zauważyłeś kiedyś, jak szybko wykonywany kod powraca do projektowania pojedynczego problemu na metodę?
Najłatwiejszym sposobem komunikacji są niestandardowe kody błędów (> 50 000). Jest również dość szybki. Oznacza to, że musisz synchronizować kod db i kod aplikacji. Za pomocą niestandardowego kodu błędu można również zwrócić przydatne informacje w ciągu komunikatu o błędzie. Ponieważ masz kod błędu ściśle na tę sytuację, możesz napisać analizator składni w kodzie aplikacji dostosowanym do formatu danych błędu.
Jakie warunki błędu wymagają logiki ponownej próby w bazie danych? Jeśli chcesz ponowić próbę po X sekundach, lepiej jest zrobić to w kodzie aplikacji, aby transakcja nie blokowała tak dużo. Jeśli od razu przesyłasz tylko operację DML, powtarzanie jej w SP może być bardziej wydajne. Pamiętaj jednak, że będziesz musiał zduplikować kod lub dodać warstwę SP, aby ponowić próbę.
Naprawdę, to jest obecnie największy problem z TRY ... logiką CATCH w SQL Server w tej chwili. Można to zrobić, ale to trochę nieudacznik. Spójrz na niektóre ulepszenia nadchodzące w tym programie SQL Server 2012, zwłaszcza ponowne zgłaszanie wyjątków systemowych (zachowując oryginalny numer błędu). Ponadto istnieje FORMATMESSAGE , który dodaje pewnej elastyczności w konstruowaniu komunikatów o błędach, szczególnie do celów rejestrowania.
źródło
To jest nasz szablon (usunięto rejestrowanie błędów)
Uwagi:
... więc nie twórz więcej TXN niż potrzebujesz
Jednak,
źródło
Używam Try / Catch, ale zbieram także jak najwięcej informacji i zapisuję je w dzienniku błędów PO wycofaniu. W tym przykładzie „LogEvent” to procedura składowana, która zapisuje do tabeli EventLog, zawierająca szczegółowe informacje o tym, co się wydarzyło. GetErrorInfo () to wywołanie funkcji, które zwraca dokładny komunikat o błędzie.
Gdy wystąpi błąd, informacje są gromadzone, procedura przeskakuje do sekcji obsługi błędów i wydaje wycofanie. Informacje są zapisywane w dzienniku, a następnie procedura kończy się.
Biorąc pod uwagę dodatkowe wywołania procedur / funkcji, wydaje się to nieco przesadzone. JEDNAK ta metoda jest niezwykle pomocna przy próbie debugowania problemu.
źródło