Форум: "Базы";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];
ВнизХранимые процедуры Найти похожие ветки
← →
MakNik (2004-12-10 14:47) [0]Подскажите, пожалуйста,
Как обеспечить откат всех действий в хранимой процедуре в случае возникновения любой ошибки внутри процедуры?
← →
Александр Иванов © (2004-12-10 14:51) [1]Транзакции использовать
← →
Stanislav © (2004-12-10 15:07) [2]Rollback transaction
← →
MakNik (2004-12-10 15:48) [3]Делаю так:
...
AS
BEGIN TRANSACTION T1
-- Шаг 1
...
-- Шаг 2 (с ошибкой)
...
-- Шаг 3
...
COMMIT TRANSACTION T1
GO
... В результате шаги 1 и 3 выполняется, а второй пропускается...
... а как отменять транзакцию при возникновении любой ошибки?
← →
Term (2004-12-10 15:59) [4]запускай транзакцию на клиенте
← →
Александр Иванов © (2004-12-10 16:07) [5]BEGIN TRANSACTION
***
IF @@ERROR<>0 GOTO ErrorHandler
***
IF @@ERROR<>0 GOTO ErrorHandler
***
IF @@ERROR<>0 GOTO ErrorHandler
COMMIT TRANSACTION
RETURN
ErrorHandler:
ROLLBACK TRANSACTION
RETURN
← →
Fin © (2004-12-17 10:33) [6]Корректно ли так:
declare @err int
set @err=0;
begin tran
insert ................
set @err= @err+@@error
insert ...............
set @err= @err+@@error
if @err=0 commit tran
else rollback
Заранее спасибо за ответ.
← →
Johnmen © (2004-12-17 10:37) [7]По логике - да. Но зачем выполнять следующий запрос, если предыдущий не прошел и будет откат ???
← →
Fin © (2004-12-17 10:48) [8]Логично, учту.
Но возник такой вопрос. Если блок:
(insert ................
.
.
insert ...............) оформить без транзакций как отдельную процедуру Proc1, а вдругой процедуре сделать так:
begin tran
exec Proc1
if @@error=0 commit tran
else rollback
будет ли призведен полный откат в случае ошибки в Proc1.
Спасибо за ответ.
← →
Ega23 © (2004-12-17 11:00) [9]2 Fin © (17.12.04 10:48) [8]
По идее - да. А зачем так всё усложнять?
← →
Nikolay M. © (2004-12-17 11:06) [10]
> Fin © (17.12.04 10:48) [8]
Да, будет ролбэк, но работать он будет далеко не оптимально, поскольку [7]. Если у тебя 1 000 инсертов, а запорот был самый первый, то прикинь, сколько ресурсов потребуется, чтобы вставить оставшиеся 999, а потом их все откатить.
← →
Александр Иванов © (2004-12-17 11:06) [11]Fin © (17.12.04 10:48) [8]
И опять выполнение "лишнего" кода в случае возникновения ошибки.
← →
Fin © (2004-12-17 11:07) [12]По идее или точно?
А на счет усложнения спорный вопрос, вместо того чтобы после каждого insert проверять ошибки, я всего один раз проверу на выходе и все...
Или я не прав?
← →
Fin © (2004-12-17 11:09) [13]Nikolay M. © [10] конструктивно, учту, скорость важна.
← →
Nikolay M. © (2004-12-17 11:17) [14]
> Fin © (17.12.04 11:07) [12]
Точно. Хоть с идеей, хоть без. Поверь, проверить 1000 раз глобальную переменную на неравенство 0 намного проще, чем 1000 раз вставить, а потом откатить данные. С точки зрения сервера, конечно. Возможно, с твоей стороны все выглядит как раз наоборот :)
Ты бы хоть по сути чего сказал, а то потом будешь жаловаться на блокировки, тормоза, а потом еще окажется, что все можно было совсем по-другому сделать...
← →
Fin © (2004-12-17 11:44) [15]Жаловатся надеюсь не буду, а насчет сути так вроде все ясно, есть несколько вставок insert при этом должны сработаль либо все либо не чего. Хотелось бы конечно что то попроще типа начало транзакции......конец транзакции, но и через @@error сойдет.
Спасибо за ответы.
← →
MakNik (2004-12-20 11:41) [16]... А как быть если ошибка возникает в результате вызова ф-ции Exec ("Update.. ")??? как откатить пердыдущие шаги?
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2005.01.23;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.038 c