![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Хранимые процедуры [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]Транзакции использовать