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

sp_test

......
begin tran

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

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

commit tran
......
go

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

P.S.: Вроде бы в 7.0 что-то такое было, а вот в 2000?
...
Рейтинг: 0 / 0
Transaction
    #32023718
SET XACT_ABORT ON
но на RAISERROR это не действует, реагирует только на native-ошибки типа нарушение уникальности, констрейнов, направильного типа и т.п.
...
Рейтинг: 0 / 0
Transaction
    #32023719
nic_ii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
перед 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
Transaction
    #32023726
dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
К сожалению, это не совсем подойдет, т.к. мне нужно вызывать в теле sp RAISERROR -((
...
Рейтинг: 0 / 0
Transaction
    #32023733
nic_ii
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
а что, после вызова RAISERROR нельзя ручками откатить транзакцию? Мне кажется что случаев с RAISERROR должно быть гораздо меньше чем общее количество операций с базой...
...
Рейтинг: 0 / 0
Transaction
    #32023736
dmitry
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Учитывая все вышесказанное, будет ли работать такая конструкция??:

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


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