Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Хранимые процедуры [D5, MSSQL]


MakNik ©   (2004-12-10 14:47:00) 

Подскажите, пожалуйста,
Как обеспечить откат всех действий в хранимой процедуре в случае возникновения любой ошибки внутри процедуры?


MakNik   (2004-12-20 11:41:00) [1]

... А как быть если ошибка возникает в результате вызова ф-ции Exec ('Update.. ')??? как откатить пердыдущие шаги?


Fin   (2004-12-17 11:44:00) [2]

Жаловатся надеюсь не буду, а насчет сути так вроде все ясно, есть несколько вставок insert при этом должны сработаль либо все либо не чего. Хотелось бы конечно что то попроще типа начало транзакции......конец транзакции, но и через @@error сойдет.
Спасибо за ответы.


Nikolay M.   (2004-12-17 11:17:00) [3]


> Fin ©   (17.12.04 11:07) [12]

Точно. Хоть с идеей, хоть без. Поверь, проверить 1000 раз глобальную переменную на неравенство 0 намного проще, чем 1000 раз вставить, а потом откатить данные. С точки зрения сервера, конечно. Возможно, с твоей стороны все выглядит как раз наоборот :)
Ты бы хоть по сути чего сказал, а то потом будешь жаловаться на блокировки, тормоза, а потом еще окажется, что все можно было совсем по-другому сделать...


Fin   (2004-12-17 11:09:00) [4]

Nikolay M. ©  [10] конструктивно, учту, скорость важна.


Fin   (2004-12-17 11:07:00) [5]

По идее или точно?
А на счет усложнения спорный вопрос, вместо того чтобы после каждого insert проверять ошибки, я всего один раз проверу на выходе и все...
Или я не прав?


Nikolay M.   (2004-12-17 11:06:00) [6]


> Fin ©   (17.12.04 10:48) [8]

Да, будет ролбэк, но работать он будет далеко не оптимально, поскольку [7]. Если у тебя 1 000 инсертов, а запорот был самый первый, то прикинь, сколько ресурсов потребуется, чтобы вставить оставшиеся 999, а потом их все откатить.


Александр Иванов   (2004-12-17 11:06:00) [7]

Fin ©   (17.12.04 10:48) [8]

И опять выполнение "лишнего" кода в случае возникновения ошибки.


Ega23   (2004-12-17 11:00:00) [8]

2 Fin ©   (17.12.04 10:48) [8]

По идее - да. А зачем так всё усложнять?


Fin   (2004-12-17 10:48:00) [9]

Логично, учту.
Но возник такой вопрос. Если блок:
(insert ................
.
.
insert ...............) оформить без транзакций как отдельную процедуру Proc1, а вдругой процедуре сделать так:
begin tran
exec Proc1
if @@error=0 commit tran
else rollback
будет ли призведен полный откат в случае ошибки в Proc1.
Спасибо за ответ.


Johnmen   (2004-12-17 10:37:00) [10]

По логике - да. Но зачем выполнять следующий запрос, если предыдущий не прошел и будет откат ???


Fin   (2004-12-17 10:33:00) [11]

Корректно ли так:
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
Заранее спасибо за ответ.


Александр Иванов   (2004-12-10 16:07:00) [12]

BEGIN TRANSACTION
***
IF @@ERROR<>0 GOTO ErrorHandler
***
IF @@ERROR<>0 GOTO ErrorHandler
***
IF @@ERROR<>0 GOTO ErrorHandler
COMMIT TRANSACTION
RETURN

ErrorHandler:
ROLLBACK TRANSACTION
RETURN


Term   (2004-12-10 15:59:00) [13]

запускай транзакцию на клиенте


MakNik   (2004-12-10 15:48:00) [14]

Делаю так:
...
AS
BEGIN TRANSACTION T1
-- Шаг 1
...
-- Шаг 2 (с ошибкой)
...
-- Шаг 3
...
COMMIT TRANSACTION T1
GO

... В результате шаги 1 и 3 выполняется, а второй пропускается...
... а как отменять транзакцию при возникновении любой ошибки?


Stanislav   (2004-12-10 15:07:00) [15]

Rollback transaction


Александр Иванов   (2004-12-10 14:51:00) [16]

Транзакции использовать


Наверх

Титульная страница Поиск, карта сайта Написать письмо