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.