Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 GO и SET XACT_ABORT ON  [new]
stenford
Member

Откуда: урал
Сообщений: 2850
Почему если в транзакции у меня имеются команды GO и установлена опция SET XACT_ABORT ON, то при возникновении ошибки исполнение скрипта не прерывается? GO нужна в скрипте т.к. в нем находятся команды на изменение ХП
Имеется-ли какой-нибудь способ заставить транзакцию откатиться после появления ошибки и прервать исполнение скрипта?
5 авг 10, 02:47    [9212356]     Ответить | Цитировать Сообщить модератору
 Re: GO и SET XACT_ABORT ON  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Вы б пример скрипта штоли привели.
5 авг 10, 06:39    [9212439]     Ответить | Цитировать Сообщить модератору
 Re: GO и SET XACT_ABORT ON  [new]
stenford
Member

Откуда: урал
Сообщений: 2850
скрипт простой, типа

set xact_abort on
begin tran

RAISERROR('error', 16, 1)
alter procedure MyProcedure...
go

print 'Update has been applied sucessfully'

commit

нужно что-бы выполнение скрипта было прервано после RAISERROR
5 авг 10, 08:26    [9212528]     Ответить | Цитировать Сообщить модератору
 Re: GO и SET XACT_ABORT ON  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
stenford,

SET XACT_ABORT ON откатывает транзакцию и прерывает выполение ТЕКУЩЕГО бача, а у вас их несколько.

И RAISERROR с 16 severety тут не поможет. "Спасти" Вас может тока 20, при ктором коннект будет закрыт сервером. Не забудьте опцию WITH LOG.
5 авг 10, 09:10    [9212633]     Ответить | Цитировать Сообщить модератору
 Re: GO и SET XACT_ABORT ON  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
stenford,

пользуйтесь SET NOEXEC ON/OFF

P.S. GO - это не команда. Это разделитель пакетов в MS SMS, QA, osql, isql, sqlcmd и т.п.
5 авг 10, 09:12    [9212636]     Ответить | Цитировать Сообщить модератору
 Re: GO и SET XACT_ABORT ON  [new]
stenford
Member

Откуда: урал
Сообщений: 2850
хм, а как тут SET NOEXEC поможет? Проблема не в том, когда компилится и исполняется, а в том, что нужно прервать выполнение скрипта (да, он состоит из нескольких батчей) и откатить все что было сделано в текущей транзакции (и соответственно в предыдущих батчах т.к. они завернуты в транзакцию).
Mожет try catch поможет?
5 авг 10, 10:04    [9212951]     Ответить | Цитировать Сообщить модератору
 Re: GO и SET XACT_ABORT ON  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
stenford
Mожет try catch поможет?


Коим образом try...catch поможет разорвать коннект - едиственное, что может помешать клиентскому приложения продолжить выполнения других бачей при свале одного из них?!
5 авг 10, 10:31    [9213164]     Ответить | Цитировать Сообщить модератору
 Re: GO и SET XACT_ABORT ON  [new]
stenford
Member

Откуда: урал
Сообщений: 2850
предотвратить выполнение следующего батча можно только разорвав коннект? Плохо. Но может в блоке catch поставить команду на разрыв соединения? Т.е. возникает еxeption -> ловится catch'ем -> разрывается коннект? А транзакция в таком случае откатится кстати?
5 авг 10, 10:42    [9213278]     Ответить | Цитировать Сообщить модератору
 Re: GO и SET XACT_ABORT ON  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
stenford
предотвратить выполнение следующего батча можно только разорвав коннект?
Я и говорю, что SET NOEXEC ON предотвратит выполнение всех последующих батчей.
А выполнить его можно в IFе, в котором проверяется @@ERROR или что-то ещё.
В нужном месте можно выполнить SET NOEXEC OFF, и продолжить выполнение остатка скрипта.
5 авг 10, 11:01    [9213468]     Ответить | Цитировать Сообщить модератору
 Re: GO и SET XACT_ABORT ON  [new]
stenford
Member

Откуда: урал
Сообщений: 2850
iap
Я и говорю, что SET NOEXEC ON предотвратит выполнение всех последующих батчей.
А выполнить его можно в IFе, в котором проверяется @@ERROR или что-то ещё.
В нужном месте можно выполнить SET NOEXEC OFF, и продолжить выполнение остатка скрипта.

@error проверять после каждого оператора это-же будет куча работы, скрипт большой, try catch тоже ругается на присутствие GO...
нормально в общем похоже апдейт-скрипты для базы сделать не получится..
5 авг 10, 11:22    [9213669]     Ответить | Цитировать Сообщить модератору
 Re: GO и SET XACT_ABORT ON  [new]
Glory
Member

Откуда:
Сообщений: 104751
stenford
iap
Я и говорю, что SET NOEXEC ON предотвратит выполнение всех последующих батчей.
А выполнить его можно в IFе, в котором проверяется @@ERROR или что-то ещё.
В нужном месте можно выполнить SET NOEXEC OFF, и продолжить выполнение остатка скрипта.

@error проверять после каждого оператора это-же будет куча работы, скрипт большой, try catch тоже ругается на присутствие GO...
нормально в общем похоже апдейт-скрипты для базы сделать не получится..

Разделитель пакетов GO вполне успешно заменяется процедурой sp_executesql или exec()
5 авг 10, 11:24    [9213685]     Ответить | Цитировать Сообщить модератору
 Re: GO и SET XACT_ABORT ON  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
stenford
@error проверять после каждого оператора это-же будет куча работы, скрипт большой...
Ну, можно использовать утилиты третьих фирм для такого преобразования многопакетного скрипта. Или написать такую утиль самому.
5 авг 10, 11:28    [9213710]     Ответить | Цитировать Сообщить модератору
 Re: GO и SET XACT_ABORT ON  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
stenford
нормально в общем похоже апдейт-скрипты для базы сделать не получится..
апдейт-скрипты можно выполнять программой SQLCMD, у которой есть опция - останавливаться после ошибки.
5 авг 10, 11:31    [9213727]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: GO и SET XACT_ABORT ON  [new]
aleksey_fomchenko
Member

Откуда: Москва
Сообщений: 1014
Нет никакой проблемы разделять DDL команды используя ";" и обернув все в TRY CATCH обработку откатывая все, если необходимо.
15 ноя 11, 03:39    [11596822]     Ответить | Цитировать Сообщить модератору
 Re: GO и SET XACT_ABORT ON  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
aleksey_fomchenko
Нет никакой проблемы разделять DDL команды используя ";" и обернув все в TRY CATCH обработку откатывая все, если необходимо.
Не получится.

Вы прочитайте этот топик, тут всё объяснили.
15 ноя 11, 08:48    [11596998]     Ответить | Цитировать Сообщить модератору
 Re: GO и SET XACT_ABORT ON  [new]
iap
Member

Откуда: Москва
Сообщений: 47144
А при чём тут ";"?
15 ноя 11, 09:13    [11597023]     Ответить | Цитировать Сообщить модератору
 Re: GO и SET XACT_ABORT ON  [new]
bebop
Member

Откуда:
Сообщений: 120
в момент, когда мы хотим прервать коннект можно как-нибудь попросить другой процесс убить нас

например:

делаем ХП kill_me

- ХП узнаёт @@spid нашего процесса
- стартует джоб который наш процесс убивает
15 ноя 11, 10:36    [11597441]     Ответить | Цитировать Сообщить модератору
 Re: GO и SET XACT_ABORT ON  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
bebop
в момент, когда мы хотим прервать коннект можно как-нибудь попросить другой процесс убить нас

например:

делаем ХП kill_me

- ХП узнаёт @@spid нашего процесса
- стартует джоб который наш процесс убивает
Сколько чудесных неработающих вариантов :-)
15 ноя 11, 11:26    [11597825]     Ответить | Цитировать Сообщить модератору
 Re: GO и SET XACT_ABORT ON  [new]
bebop
Member

Откуда:
Сообщений: 120
alexeyvg
bebop
в момент, когда мы хотим прервать коннект можно как-нибудь попросить другой процесс убить нас

например:

делаем ХП kill_me

- ХП узнаёт @@spid нашего процесса
- стартует джоб который наш процесс убивает
Сколько чудесных неработающих вариантов :-)


Это почему это неработающих?
15 ноя 11, 11:29    [11597854]     Ответить | Цитировать Сообщить модератору
 Re: GO и SET XACT_ABORT ON  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
bebop
alexeyvg
пропущено...
Сколько чудесных неработающих вариантов :-)


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

Описаны-же 2 беспроигрышных способа, какие ещё TRY CATCH и джобы?
15 ноя 11, 14:40    [11599680]     Ответить | Цитировать Сообщить модератору
 Re: GO и SET XACT_ABORT ON  [new]
Glory
Member

Откуда:
Сообщений: 104751
bebop
Это почему это неработающих?

Вы пробовали запустить еще раз уже работающий джоб ?
15 ноя 11, 14:56    [11599880]     Ответить | Цитировать Сообщить модератору
 Re: GO и SET XACT_ABORT ON  [new]
bebop
Member

Откуда:
Сообщений: 120
alexeyvg
Потому что между стартом джоба и убийством процесса может пройти, например, секунда, за которую процесс вполне успеет выполнить тысячу команд.

Описаны-же 2 беспроигрышных способа, какие ещё TRY CATCH и джобы?


Это не проблема - можно же WAITFOR сделать бесконечный следующей командой после запуска джоба

по поводу второй реплики - :) не придирайтесь к моим творческим порывам
15 ноя 11, 18:19    [11601817]     Ответить | Цитировать Сообщить модератору
 Re: GO и SET XACT_ABORT ON  [new]
bebop
Member

Откуда:
Сообщений: 120
Glory
bebop
Это почему это неработающих?

Вы пробовали запустить еще раз уже работающий джоб ?


Ну автор использует схему для проливки скриптов - обычно это делается в один поток и проблем с тем что джоб уже кто-то занял не будет
15 ноя 11, 18:21    [11601833]     Ответить | Цитировать Сообщить модератору
 Re: GO и SET XACT_ABORT ON  [new]
Glory
Member

Откуда:
Сообщений: 104751
bebop
обычно это делается в один поток и проблем с тем что джоб уже кто-то занял не будет

Обычно серверные процедуры могут использовать многие коннекты
15 ноя 11, 18:24    [11601844]     Ответить | Цитировать Сообщить модератору
 Re: GO и SET XACT_ABORT ON  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31983
bebop
по поводу второй реплики - :) не придирайтесь к моим творческим порывам
Ну только в качестве творческих порывов :-)
15 ноя 11, 19:59    [11602287]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить