У Алекса Кузнецова есть большая глава в его книге « Защитное программирование базы данных» (глава 8), в которой рассматриваются T-SQL TRY ... CATCH, транзакции T-SQL и настройки SET XACT_ABORT, а также использование обработки ошибок на стороне клиента. Это поможет вам решить, какой из вариантов больше всего подходит для выполнения.
Он доступен бесплатно на этом сайте . Я никоим образом не связан с компанией, но у меня есть печатная версия этой книги.
Есть много маленьких деталей по этому вопросу, которые очень хорошо объяснил Алекс.
По просьбе Ника ... (но не все это в главе)
С точки зрения масштабирования, вы должны быть абсолютно честными в отношении того, какие действия должны быть в коде БД, а какие - в приложении. Вы когда-нибудь замечали, как быстро исполняемый код возвращается к разработке для одной задачи на метод?
Самый простой способ связи - это пользовательские коды ошибок (> 50 000). Это также довольно быстро. Это означает, что вам нужно синхронизировать код БД и приложения. С помощью специального кода ошибки вы также можете вернуть полезную информацию в строке сообщения об ошибке. Поскольку у вас есть код ошибки строго для этой ситуации, вы можете написать анализатор в коде приложения, адаптированном к формату данных ошибки.
Кроме того, при каких условиях ошибки требуется повторная логика в базе данных? Если вы хотите повторить попытку через X секунд, то лучше обработать это в коде приложения, чтобы транзакция не блокировалась так сильно. Если вы только повторно отправляете операцию DML, повторение ее в SP может быть более эффективным. Имейте в виду, однако, что вам придется дублировать код или добавить слой SP, чтобы выполнить повторную попытку.
Действительно, в настоящее время это самая большая проблема с логикой TRY ... CATCH в SQL Server на данный момент. Это можно сделать, но это немного глупо. Ищите некоторые улучшения в SQL Server 2012, особенно перезапуск системных исключений (с сохранением исходного номера ошибки). Кроме того, есть FORMATMESSAGE , который добавляет некоторую гибкость в создании сообщений об ошибках, особенно для целей ведения журнала.