Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Transaction
|
|||
|---|---|---|---|
|
#18+
Здравствуйте! Вопрос такой: существует ли механизм автоматического отката транзакции в случае какого-либо сбоя при выполнении операции, т.е.: например, есть процедура: sp_test ...... begin tran /*делаем что-нибудь*/ if @@error!=0 rollback tran /*... и т.д.*/ commit tran ...... go Чтобы после каждого действия не проверять, была ли ошибка, можно ли указать как-нибудь, что в случае сбоя сразу делалось Rollback Tran?? P.S.: Вроде бы в 7.0 что-то такое было, а вот в 2000? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2002, 08:02 |
|
||
|
Transaction
|
|||
|---|---|---|---|
|
#18+
SET XACT_ABORT ON но на RAISERROR это не действует, реагирует только на native-ошибки типа нарушение уникальности, констрейнов, направильного типа и т.п. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2002, 08:17 |
|
||
|
Transaction
|
|||
|---|---|---|---|
|
#18+
перед 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 тут же завершается... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2002, 08:23 |
|
||
|
Transaction
|
|||
|---|---|---|---|
|
#18+
К сожалению, это не совсем подойдет, т.к. мне нужно вызывать в теле sp RAISERROR -(( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2002, 09:26 |
|
||
|
Transaction
|
|||
|---|---|---|---|
|
#18+
а что, после вызова RAISERROR нельзя ручками откатить транзакцию? Мне кажется что случаев с RAISERROR должно быть гораздо меньше чем общее количество операций с базой... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2002, 10:23 |
|
||
|
Transaction
|
|||
|---|---|---|---|
|
#18+
Учитывая все вышесказанное, будет ли работать такая конструкция??: 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 При этом любая ошибка будет вызывать откат транзакции,а выполнение <условия> вызовет <сообщение> и откат транзакции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2002, 10:34 |
|
||
|
Transaction
|
|||
|---|---|---|---|
|
#18+
Работать будет, но неправильно и с ошибкой. Надо после строк RAISERROR и ROLLBACK поместить RETURN, иначе операторы будут выполняться и дальше, пока не наткнутся на лишний COMMIT. Строка в конце процедуры SET XACT_ABORT OFF лишняя, так как установка SET XACT_ABORT ON внутри процедуры действует только до окончания работы процедуры. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2002, 13:01 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32023719&tid=1823786]: |
0ms |
get settings: |
11ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
63ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
2ms |
| others: | 257ms |
| total: | 415ms |

| 0 / 0 |
