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

Вниз

Транзакзии на 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.017 c
14-12505
REP
2004-02-12 07:47
2004.03.05
Однозначный транслит


14-12481
Knight
2004-02-13 22:12
2004.03.05
Дружит ли Delphi5 и 7 ?


4-12587
alex_***
2003-12-30 15:18
2004.03.05
из hdc получить HWND его окна


1-12359
tria
2004-02-25 14:21
2004.03.05
Не заходит отладчик в мой модуль


1-12411
Budy
2004-02-22 22:11
2004.03.05
TMemo