Форум: "Базы";
Текущий архив: 2004.03.05;
Скачать: [xml.tar.bz2];
ВнизТранзакзии на IB Найти похожие ветки
← →
Anton (2004-02-07 13:12) [0]С транзакциями раньше работал на MSSQL....
например, такой код:
BEGIN TRAN t1
INSERT INTO ......
IF @@ERROR<>0 GOTO error
UPDATE .....
IF @@ERROR<>0 GOTO error
INSERT INTO .....
IF @@ERROR<>0 GOTO error
COMMIT TRAN t1
RETURN
error:
ROLLBACK TRAN t1
т.е. если все INSERT-ы UPDATE-ы выполнились - все ОК.
если при выполнении одного из них возникла ошибка - отменяем все INSERT-ы с UPDATE-ми, т.е. откатываем транзакцию.
Вопрос - как подобное изобразить на IB в ХП
← →
Sergey_Masloff (2004-02-07 13:17) [1]В IB нельзя управлять транзакциями на сервере. Только с клиента.
Просто в случае ошибки делай rollback с клиента.
← →
Romkin (2004-02-07 13:22) [2]Точно как написано - никак :)
Во-первых, транзакциями управляет только клиент, сервер может только откатить транзакцию, если клиент отвалился.
Во-вторых, при возникновении (или возбуждении) exception в хп оно передается на клиента, а там, как правило, стоит блок
ibtrans.StartTransaction
try
... //работаем
ibTrans.Commit;
except
ibTrans.Rollback;
raise;
end;
Процедура выполняется всегда в одной транзакции, при ошибке происходит откат всех действий, прошедших с последнего SUSPEND (если его нет - откатываются все действия ХП), и ошибка передается на клиента. Он, правда, может и не откатывать транзакцию :)
То есть в твоем случае ты смело можешь писать в одной процедуре блок insert, update и тд. Если будет ошибка - все действия блока откатятся автоматически.
← →
Anton (2004-02-07 13:24) [3]Блин, так и знал..
Но все же надеялся, что это я не знаю как сделать, а IB умеет ...
← →
Romkin (2004-02-07 13:31) [4]Если тебе надо
"если все INSERT-ы UPDATE-ы выполнились - все ОК.
если при выполнении одного из них возникла ошибка - отменяем все INSERT-ы с UPDATE-ми"
То, как я сказал, пиши в одной процедуре всех их подряд, получишь то, что хочешь
← →
Digitman (2004-02-07 13:36) [5]
> Anton (07.02.04 13:24) [3]
кое-чем, вероятно, тебе здесь может помочь механизм savepoint"ов (частичный откат тек.транзакции к точкам сохранения, устанавливаемым тобой явно в теле SP/триггера), если откажешься от IB в пользу FB
← →
Anton (2004-02-07 13:36) [6]м-да....
а вот, в случае разрыва связи клиента с сервером - точно ли транзакция откатится?
← →
Digitman (2004-02-07 13:47) [7]
> Anton (07.02.04 13:36) [6]
обязана откатиться
подтверждения же транзакции нет
← →
Anton (2004-02-07 13:52) [8]"То, как я сказал, пиши в одной процедуре всех их подряд, получишь то, что хочешь" - да, конечно, так и сделаю, спасибо.
Так и хотел делать, но все же надеялся, что IB умеет сам работать с транзакциями без клиента. Согласись, обработка транзакций на сервере целиком - значительно надежней. Многие MSSQL матерят, хотя он имеет не мало преимуществ ..., хотя бы вот это(обходиться с транзакциями самостоятельно).
← →
KA_ (2004-02-07 14:39) [9]>Sergey_Masloff (07.02.04 13:17) [1]
>В IB нельзя управлять транзакциями на сервере
>Romkin © (07.02.04 13:22) [2]
>Точно как написано - никак :)
А как же SET TRANSACTION, COMMIT, ROLLBACK. Они ведь доступны и в DSQL и в embedded SQL?
← →
Digitman (2004-02-07 14:53) [10]DSQL и EmbSQL имеют отношение только к кл.стороне
серверная сторона - это PSQL, где там никаких языковых конструкций управления транзакциями
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2004.03.05;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c