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