Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.032 c
4-1102398395
Помощник админа
2004-12-07 08:46
2005.01.23
Логин пользователя, запустившего процесс


1-1104938585
nekant
2005-01-05 18:23
2005.01.23
сдвиг сообщ. Error


14-1104328422
PVOzerski
2004-12-29 16:53
2005.01.23
Может, и нашего сайта дизайн и "движок" оцените?


1-1104945007
CBOLOCH
2005-01-05 20:10
2005.01.23
Указатель на первую инструкцию программы


14-1105211049
|Denis|
2005-01-08 22:04
2005.01.23
Unix системы. FreeBSD.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский