Более низкие ошибки, 15000 и ниже IIRC, а также более высокие уровни серьезности, выполнение прерывания. Это означает, что весь поток прерван, нет возможности уловить его внутри хранимого кода proc.
В любом случае ошибки не зависят от кода SQL или хранимых процедур. Ошибки с более низкой нумерацией - это «жесткие» ошибки, и вы ничего не можете с этим поделать, даже если вы заманили в ловушку. Он находится в пределах серверов (а не вашего) домена. Например. ошибка жесткого диска; 1205. Сервер решает, поток не может продолжаться и завершает работу spid.
Невозможно уловить этот внешний домен ошибок, который вы не администрировали, не настраивали и не контролировали. Поэтому я не могу понять, что вы ожидаете, что сможете. единственный способ трапа (например, аппаратные ошибки и взаимоблокировки) - это если вы написали свой собственный сервер.
Но самое главное. вы нарушаете основные законы управления транзакциями (которые находятся внутри вашей власти) путем обработки взаимодействия с пользователем , когда транзакция открыта. Правило (без изменений в течение 40 лет) составляет:
- не выполняет все взаимодействие пользователя с не сделками с открытой
- , когда это будет завершено, прекратить дальнейшее взаимодействие
- пользователя начать транзакцию,
- выполнять все ваши DML и
- commit
.
Несоблюдение этих правил приводит к различным проблемам, которые легко предотвратить (по соответствии с правилом):
- неконтролируемая продолжительность блокировки
- повесила операции (ожидание для пользователей, имеющих обедали)
- очень медленный отклик, и сервер простаивает, ожидая блокировок
.
Если вы едете на машине, конечно, вы можете поиграть на пригородных улицах и торговых центрах, но как только вы получите одну автостраду, вы не сможете ехать меньше, чем ограничение скорости; вы не можете останавливаться и ждать пассажиров. Если да, вы повесите всех. Попытка поймать вызов сотового телефона, который заставит полицию приходить после вас, или пытаться остановить полицию от вытаскивания вас, - это хорошо, несколько выше ваших сил, могущественных, как они могут быть.
.
В нормальных обстоятельствах, когда сервер испытывает трудную ошибку, и он отменяет ваш спад (который, конечно, включает откат), проблема закрывается. Поведение в соответствии с требованиями ANSI SQL 89 (предшествующий 92). Сделки являются атомными и долговечными. Теперь, если вы не кодируете эту модель (запрашивая изоляцию и согласованность), это не «транзакция», а просто строка неконтролируемого SQL, распространяемая по времени и пространству, легко прерывается; хрупкой и уязвимой.
Очевидно, что означает NO AUTOCOMMIT и NO прикован, потому что он нарушает стандарт ANSI SQL. Очень грустно, что (а) MS предоставляет такую больную функцию, и (б) люди используют ее, не понимая опасности и несоблюдения.
Вместо того, чтобы думать о том, что, по вашему мнению, сервер должен и не должен делать (что бесполезно, потому что оно не изменится), я предлагаю вам взять на себя ответственность за код, который вы производите, и воспитывать себя как работает сервер, что он на самом деле делает, до разработки и написания кода.
Put в ваших терминах, о это, безусловно, выполняет TRY/поймать/наконец и половину ошибок он улавливает потому что захватит вас, поэтому ваш попробовать/поймать никогда не будет выполнять. Понятие Ваш SQL-код пытается наконец не существует. SQL - это язык управления базами данных высокого уровня, а не язык низкого уровня, который может контролировать аппаратные ресурсы.
Если вы за рулем автомобиля, на автостраде, вы не можете поймать (а) мост десять километров перед вами обрушится или (б) полиция закрытия автострада один километр перед вами
Попытка контролировать неконтролируемое, конечно ...
не было бы проще (и больше смысла), чтобы предоставить шаблон для хранимых процедур? Это может быть быстро проверено кодом для правильности ... –
Это уже сделано, включая стандартную обработку ошибок, но поскольку SQL Server 2005 не имеет понятия try/catch/finally, просто попробуйте/поймайте, можно ввести логику, которая просто возвращается в середине транзакции, оставляя транзакцию открытой. Для этого нам нужно лучшее решение для обнаружения и контроля этих типов ошибок. –
@ Шкотт Маркуэлл: Наконец, это действительно сразу после «END CATCH»! – gbn