Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 опять о главном XACT_ABORT ON или if @@error<>0 GOTO...  [new]
goga2003
Guest
В каких случаях при старте транзакции на сервере использовать
SET XACT_ABORT ON
, а в каких случаях не обойтись без конструкции

start tran

/*sql-statement*/
if @@error<>0 goto UNDO
if @@trancount>0 commit tran
return(0)

UNDO:
if @@trancount>0 rollback tran
return(1)


Я так полагаю что если не используются транзакции с savepoint-ами, когда какой то кусок нужно оставить "подтвержденным", то лучше и проще использовать SET XACT_ABORT ON, в том числе и для вложенных транзакций, когда, например, происходит вызов одной хп из другой и в обоих стартуется транзакция.

Когда же в одном блоке стартуется две транзакции (невложенные) или транзакции с savepoint-ами и в случае ошибки одна транзакция должна быть по-любому подтверждена при возникновении ошибки во второй, то в этом случае без if @@error<>0 GOTO .... не обойтись

Прав ли я.
Если не прав, поправьте и сформулируйте правильный выбор.
21 ноя 03, 17:07    [428799]     Ответить | Цитировать Сообщить модератору
 Re: опять о главном XACT_ABORT ON или if @@error<>0 GOTO...  [new]
funikovyuri
Member

Откуда: Симферополь
Сообщений: 4045
https://www.sql.ru/forum/actualtopics.aspx?search=SET+XACT_ABORT+ON&submit=%CD%E0%E9%F2%E8&bid=1
21 ноя 03, 17:57    [428889]     Ответить | Цитировать Сообщить модератору
 Re: опять о главном XACT_ABORT ON или if @@error<>0 GOTO...  [new]
ua-soft
Member

Откуда: Украина, Киев
Сообщений: 119
Сейчас переводим базу с Interbase на MSSQL. Чтобы совсем не выбрасывать наработанные алгоритмы, исппользуем SET XACT_ABORT ON;SET IMPLICIT_TRANSACTIONS OFF; В этом случае MSSQL с транзакциями (в смысле ошибок и подтверждения/отката) ведет себя также как другие SQL сервера (другие - Oracle и Interbase).

Честно говоря, режим в котором комитится каждая SQL команда для меня является "диким" и область использования, кроме как в административных целях, мне тяжело представить.
21 ноя 03, 17:57    [428890]     Ответить | Цитировать Сообщить модератору
 Re: опять о главном XACT_ABORT ON или if @@error<>0 GOTO...  [new]
guest2003
Guest
to funikovyuri
я поиском пользоваться умею :)
просто прочитав все подобные топики, хотелось бы для себя раз и навсегда хоть как то формализовать когда использовать XACT_ABORT, а когда
if @@error<>0 goto UNDO
23 ноя 03, 15:00    [429624]     Ответить | Цитировать Сообщить модератору
 Re: опять о главном XACT_ABORT ON или if @@error<>0 GOTO...  [new]
alexey_1979
Member

Откуда: Москва
Сообщений: 155
@@error нужно использовать, когда у тебя в триггере рейзиться ошибка - raiserror('bla-bla-bla',11,1), а rollback-а не делается.
Было бы клево иметь штуку, типа raiseapperror, как в оракле...
Короче, даже с установленным xact_abort простой raiserror транзакцию автоматом не откатит...
23 ноя 03, 16:17    [429664]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить