![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Транзакзии на IB [D6, IB5.x, IB6.x]
Anton © (2004-02-07 13:12:00)
С транзакциями раньше работал на 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 в ХП
Digitman (2004-02-07 14:53:00) [1]
DSQL и EmbSQL имеют отношение толькок кл.стороне
серверная сторона - это PSQL, где там никаких языковых конструкций управления транзакциями
KA_ (2004-02-07 14:39:00) [2]
>Sergey_Masloff (07.02.04 13:17) [1]
>В IB нельзя управлять транзакциями на сервере
>Romkin © (07.02.04 13:22) [2]
>Точно как написано - никак :)
А как же SET TRANSACTION, COMMIT, ROLLBACK. Они ведь доступны и в DSQL и в embedded SQL?
Anton (2004-02-07 13:52:00) [3]
"То, как я сказал, пиши в одной процедуре всех их подряд, получишь то, что хочешь" - да, конечно, так и сделаю, спасибо.
Так и хотел делать, но все же надеялся, что IB умеет сам работать с транзакциями без клиента. Согласись, обработка транзакций на сервере целиком - значительно надежней. Многие MSSQL матерят, хотя он имеет не мало преимуществ ..., хотя бы вот это(обходиться с транзакциями самостоятельно).
Digitman (2004-02-07 13:47:00) [4]
> Anton (07.02.04 13:36) [6]
обязана откатиться
подтверждения же транзакции нет
Digitman (2004-02-07 13:36:00) [5]
> Anton (07.02.04 13:24) [3]
кое-чем, вероятно, тебе здесь может помочь механизм savepoint"ов (частичный откат тек.транзакции к точкам сохранения, устанавливаемым тобой явно в теле SP/триггера), если откажешься от IB в пользу FB
Anton (2004-02-07 13:36:00) [6]
м-да....
а вот, в случае разрыва связи клиента с сервером - точно ли транзакция откатится?
Romkin (2004-02-07 13:31:00) [7]
Если тебе надо
"если все INSERT-ы UPDATE-ы выполнились - все ОК.
если при выполнении одного из них возникла ошибка - отменяем все INSERT-ы с UPDATE-ми"
То, как я сказал, пиши в одной процедуре всех их подряд, получишь то, что хочешь
Anton (2004-02-07 13:24:00) [8]
Блин, так и знал..
Но все же надеялся, что это я не знаю как сделать, а IB умеет ...
Romkin (2004-02-07 13:22:00) [9]
Точно как написано - никак :)
Во-первых, транзакциями управляет только клиент, сервер может только откатить транзакцию, если клиент отвалился.
Во-вторых, при возникновении (или возбуждении) exception в хп оно передается на клиента, а там, как правило, стоит блок
ibtrans.StartTransaction
try
... //работаем
ibTrans.Commit;
except
ibTrans.Rollback;
raise;
end;
Процедура выполняется всегда в одной транзакции, при ошибке происходит откат всех действий, прошедших с последнего SUSPEND (если его нет - откатываются все действия ХП), и ошибка передается на клиента. Он, правда, может и не откатывать транзакцию :)
То есть в твоем случае ты смело можешь писать в одной процедуре блок insert, update и тд. Если будет ошибка - все действия блока откатятся автоматически.
Sergey_Masloff (2004-02-07 13:17:00) [10]
В IB нельзя управлять транзакциями на сервере. Только с клиента.
Просто в случае ошибки делай rollback с клиента.