Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Transaction / 8 сообщений из 8, страница 1 из 1
22.02.2002, 08:02
    #32023713
dmitry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Transaction
Здравствуйте!
Вопрос такой: существует ли механизм автоматического отката транзакции в случае какого-либо сбоя при выполнении операции, т.е.:
например, есть процедура:

sp_test

......
begin tran

/*делаем что-нибудь*/
if @@error!=0 rollback tran

/*... и т.д.*/

commit tran
......
go

Чтобы после каждого действия не проверять, была ли ошибка, можно ли указать как-нибудь, что в случае сбоя сразу делалось Rollback Tran??

P.S.: Вроде бы в 7.0 что-то такое было, а вот в 2000?
...
Рейтинг: 0 / 0
22.02.2002, 08:17
    #32023718
Transaction
SET XACT_ABORT ON
но на RAISERROR это не действует, реагирует только на native-ошибки типа нарушение уникальности, констрейнов, направильного типа и т.п.
...
Рейтинг: 0 / 0
22.02.2002, 08:23
    #32023719
nic_ii
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Transaction
перед BEGIN TRAN ставь:
SET XACT_ABORT ON

документация гласит:
When SET XACT_ABORT is ON, if a Transact-SQL statement raises a run-time error, the entire transaction is terminated and rolled back. When OFF, only the Transact-SQL statement that raised the error is rolled back and transaction continues processing.

По моему опыту при возникновении ошибки в случае XACT_ABORT ON sp тут же завершается...
...
Рейтинг: 0 / 0
22.02.2002, 09:26
    #32023726
dmitry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Transaction
К сожалению, это не совсем подойдет, т.к. мне нужно вызывать в теле sp RAISERROR -((
...
Рейтинг: 0 / 0
22.02.2002, 10:23
    #32023733
nic_ii
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Transaction
а что, после вызова RAISERROR нельзя ручками откатить транзакцию? Мне кажется что случаев с RAISERROR должно быть гораздо меньше чем общее количество операций с базой...
...
Рейтинг: 0 / 0
22.02.2002, 10:34
    #32023736
dmitry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Transaction
Учитывая все вышесказанное, будет ли работать такая конструкция??:

sp_test
......
SET XACT_ABORT ON
begin tran

/*command_1*/
........
if <условие> begin
RAISERROR ... <сообщение>
ROLLBACK TRAN
end
/*command_n*/

commit tran
......
SET XACT_ABORT OFF
go

При этом любая ошибка будет вызывать откат транзакции,а выполнение <условия> вызовет <сообщение> и откат транзакции?
...
Рейтинг: 0 / 0
22.02.2002, 13:01
    #32023767
Transaction
Работать будет, но неправильно и с ошибкой. Надо после строк RAISERROR и ROLLBACK поместить RETURN, иначе операторы будут выполняться и дальше, пока не наткнутся на лишний COMMIT. Строка в конце процедуры SET XACT_ABORT OFF лишняя, так как установка SET XACT_ABORT ON внутри процедуры действует только до окончания работы процедуры.
...
Рейтинг: 0 / 0
22.02.2002, 13:05
    #32023769
dmitry
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Transaction
2 Глеб Уфимцев
Большое спасибо!
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Transaction / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]