Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.01.23;
Скачать: CL | DM;

Вниз

Хранимые процедуры   Найти похожие ветки 

 
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;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.028 c
14-1104590246
vopros
2005-01-01 17:37
2005.01.23
Уберите их с экрана пожайлуста


4-1102135227
W00dy
2004-12-04 07:40
2005.01.23
WinApi


1-1105608718
Саня
2005-01-13 12:31
2005.01.23
Сеанс MS-DOS


1-1104089765
X3M
2004-12-26 22:36
2005.01.23
Левая/правая кнопа мыши


1-1105598240
Bless
2005-01-13 09:37
2005.01.23
Проблема с округлением в Делфи