2010-11-02 3 views
3

Есть ли способ ловушки error 266 внутри JDBC или внутри SQL, каким-то образом обертывая оператор exec?Ошибка захвата 266 в SQL Server 2005

Мы стремимся разработать защиту вокруг хранимых процедур, выходящих с транзакцией, открытой открытым обычным способом. Это помогает избежать ошибок программиста, что может привести к значительным проблемам в сочетании с пулом соединений.

+0

не было бы проще (и больше смысла), чтобы предоставить шаблон для хранимых процедур? Это может быть быстро проверено кодом для правильности ... –

+0

Это уже сделано, включая стандартную обработку ошибок, но поскольку SQL Server 2005 не имеет понятия try/catch/finally, просто попробуйте/поймайте, можно ввести логику, которая просто возвращается в середине транзакции, оставляя транзакцию открытой. Для этого нам нужно лучшее решение для обнаружения и контроля этих типов ошибок. –

+0

@ Шкотт Маркуэлл: Наконец, это действительно сразу после «END CATCH»! – gbn

ответ

1
  1. Более низкие ошибки, 15000 и ниже IIRC, а также более высокие уровни серьезности, выполнение прерывания. Это означает, что весь поток прерван, нет возможности уловить его внутри хранимого кода proc.

  2. В любом случае ошибки не зависят от кода SQL или хранимых процедур. Ошибки с более низкой нумерацией - это «жесткие» ошибки, и вы ничего не можете с этим поделать, даже если вы заманили в ловушку. Он находится в пределах серверов (а не вашего) домена. Например. ошибка жесткого диска; 1205. Сервер решает, поток не может продолжаться и завершает работу spid.

  3. Невозможно уловить этот внешний домен ошибок, который вы не администрировали, не настраивали и не контролировали. Поэтому я не могу понять, что вы ожидаете, что сможете. единственный способ трапа (например, аппаратные ошибки и взаимоблокировки) - это если вы написали свой собственный сервер.

  4. Но самое главное. вы нарушаете основные законы управления транзакциями (которые находятся внутри вашей власти) путем обработки взаимодействия с пользователем , когда транзакция открыта. Правило (без изменений в течение 40 лет) составляет:

    • не выполняет все взаимодействие пользователя с не сделками с открытой
    • , когда это будет завершено, прекратить дальнейшее взаимодействие
    • пользователя начать транзакцию,
    • выполнять все ваши DML и
    • commit
      .
  5. Несоблюдение этих правил приводит к различным проблемам, которые легко предотвратить (по соответствии с правилом):

    • неконтролируемая продолжительность блокировки
    • повесила операции (ожидание для пользователей, имеющих обедали)
    • очень медленный отклик, и сервер простаивает, ожидая блокировок
      .
      Если вы едете на машине, конечно, вы можете поиграть на пригородных улицах и торговых центрах, но как только вы получите одну автостраду, вы не сможете ехать меньше, чем ограничение скорости; вы не можете останавливаться и ждать пассажиров. Если да, вы повесите всех. Попытка поймать вызов сотового телефона, который заставит полицию приходить после вас, или пытаться остановить полицию от вытаскивания вас, - это хорошо, несколько выше ваших сил, могущественных, как они могут быть.
      .
  6. В нормальных обстоятельствах, когда сервер испытывает трудную ошибку, и он отменяет ваш спад (который, конечно, включает откат), проблема закрывается. Поведение в соответствии с требованиями ANSI SQL 89 (предшествующий 92). Сделки являются атомными и долговечными. Теперь, если вы не кодируете эту модель (запрашивая изоляцию и согласованность), это не «транзакция», а просто строка неконтролируемого SQL, распространяемая по времени и пространству, легко прерывается; хрупкой и уязвимой.

    Очевидно, что означает NO AUTOCOMMIT и NO прикован, потому что он нарушает стандарт ANSI SQL. Очень грустно, что (а) MS предоставляет такую ​​больную функцию, и (б) люди используют ее, не понимая опасности и несоблюдения.

  7. Вместо того, чтобы думать о том, что, по вашему мнению, сервер должен и не должен делать (что бесполезно, потому что оно не изменится), я предлагаю вам взять на себя ответственность за код, который вы производите, и воспитывать себя как работает сервер, что он на самом деле делает, до разработки и написания кода.

  8. Put в ваших терминах, о это, безусловно, выполняет TRY/поймать/наконец и половину ошибок он улавливает потому что захватит вас, поэтому ваш попробовать/поймать никогда не будет выполнять. Понятие Ваш SQL-код пытается наконец не существует. SQL - это язык управления базами данных высокого уровня, а не язык низкого уровня, который может контролировать аппаратные ресурсы.

    Если вы за рулем автомобиля, на автостраде, вы не можете поймать (а) мост десять километров перед вами обрушится или (б) полиция закрытия автострада один километр перед вами

    Попытка контролировать неконтролируемое, конечно ...

+0

Вы предполагаете, что люди, которые пишут код, непогрешимы. Я не могу сделать это предположение. Люди пишут код, просматривают код, упаковывают его для развертывания. Все рассмотренные варианты использования показали, что соответствующий ход действий в такой ситуации заключается в откате транзакции зависания, что было бы сделано в любом случае, если объединение пулов не было включено. Я не пытаюсь защищаться от самого сервера, но защищаю человеческую ошибку. Существует несколько способов уменьшить человеческую ошибку, это один из них. –

+0

Чтобы сделать себя немного более понятным, ошибка 266 не отменяет транзакцию, что и есть. –

+0

Напротив, люди, особенно программисты SQL, ошибаются; поэтому сервер должен ловить ошибки, выходящие за рамки управления pgmrs и т. д., и справляться с этим. Это суть моего поста. Я все еще говорю, у вас есть проблема с pgmg, поскольку вы оставили xact open, когда соединение закрывается, и реализация того, что я подробно описал, является формальным методом защиты от ошибки pgmr. Смешанный un/chain просто не работает. MS не делает много чего, что должно. – PerformanceDBA

3

Да. Использовать SET XACT_ABORT ON.

Он подавляет ошибку 266, а также отменяет откат при любых обстоятельствах, включая тайм-ауты клиентской команды, которые просто прерываются.

Это отдельно от точек, сделанных PerformanceDBA, которые в основном действительны.

Другие ссылки:

+0

Очень интересный материал и предоставляет некоторые возможности для изучения, но установка XACT_ABORT ON не обеспечивает средства захвата 266, есть ситуации с кодом из-за ошибки программиста, которая не приведет к чему-то, чтобы вызвать XACT_ABORT для отката, но все же вызывает 266 –

+0

Вот почему вы shozuld имеете шаблон proc :-) Вы правы, хотя SET XACT_ABORT ON подавляет 266, что могло бы произойти иначе. – gbn