Олексій Кузнєцов має велику главу у своїй книзі Захисне програмування баз даних (Глава 8), яка охоплює налаштування T-SQL TRY ... CATCH, транзакції T-SQL та SET XACT_ABORT, а також використовує керування помилками на стороні клієнта. Це дуже допоможе вам вирішити, який із варіантів має найбільш сенс для того, що вам потрібно виконати.
Він доступний безкоштовно на цьому сайті . Я жодним чином не пов’язаний з цією компанією, але в мене є версія на паперовій версії цієї книги.
На цю тему існує дуже багато дрібних деталей, які дуже добре пояснив Олексій.
За запитом Ніка ... (але не все це в главі)
Щодо масштабування, ви повинні бути по-звірячому чесними щодо того, які дії повинні бути в коді db, а які - у програмі. Ви коли-небудь помічали, як швидко виконує код, як правило, повертається до розробки для однієї проблеми за методом?
Найпростіший спосіб спілкування - це власні коди помилок (> 50 000). Це також досить швидко. Це означає, що вам доведеться синхронізувати код DB та код програми. За допомогою спеціального коду помилки ви також можете повернути корисну інформацію в рядку повідомлення про помилку. Оскільки у вас є код помилки виключно для цієї ситуації, ви можете написати аналізатор у коді програми, адаптованому до формату даних про помилку.
Крім того, які умови помилок потребують логіки повторної роботи в базі даних? Якщо ви хочете повторити спробу через X секунд, вам краще попрацювати з цим кодом програми, щоб транзакція не блокувалась так сильно. Якщо ви одразу повторно подаєте операцію DML, повторення її в ІП може бути ефективнішим. Майте на увазі, що для повторної спроби вам, можливо, доведеться дублювати код або додати шар SP.
Дійсно, на даний момент це найбільший біль з TRY ... Логіка CATCH у SQL Server на даний момент. Зробити це можна, але це трохи ой. Подивіться на деякі вдосконалення, що стосуються цього в SQL Server 2012, особливо повторне викидання системних винятків (зберігши початковий номер помилки). Крім того, існує FORMATMESSAGE , який додає певної гнучкості у створенні повідомлень про помилки, особливо для цілей реєстрації.