В тексте процедур оператор commit можно юзать ?
Добавлено: 17 фев 2005, 13:34
сабж
Форум по InterBase, Firebird и Yaffil
http://ibaseforum.ru/
Кому? Выражайся проще, пожалуйста, я не понял ничего.то это до фени ?
Дим. Иногда это требуется, и Fyracle это поддерживает. Но я согласег что использование commit в SP равнозначно попытке использования массивов.kdv писал(а):про транзакции вообще читал? www.ibase.ru/devinfo/ibtrans.htm
starttransaction и commit/rollback делает только клиент. в процедурах-триггерах это делать без надобности.
это тебе кажетсяИногда это требуется
Нет реальный опытkdv писал(а):это тебе кажетсяИногда это требуется
Вот это да, гдетолько народ такую траву берет :-/ ?dimitr писал(а):На самом деле, коммит в процедурах - это всего навсего сброс кеша и чистка сейвпойнтов. Т.е. наш commit retaining + пересоздание пустого сейвпойнт-стека процедуры в его виде на момент коммита/роллбека. Что технически сделать можно, хоть и накладно это будет. И я даже соглашусь, что иногда этого хочется. Но меня больше волнует семантика. Коммит нарушает логику обработки ошибок.
Вполне мирно решается способомdimitr писал(а):1) обработка ошибок в блоке
BEGIN
<блок 1>
COMMIT;
<блок 2>
END
в случае ошибки в блоке 2, отката первого блока не произойдет.
Не это к практологу, человек выдумывает потом решет задачу и в итоге 8-0. Рельно в жызни то что написал Кузменко Д.dimitr писал(а): 2) если сейвпойнты разрешены в PSQL
BEGIN
SAVEPOINT A;
COMMIT;
ROLLBACK TO SAVEPOINT A;
END
тут будет рантайм-ошибка, хотя компиляция пройдет.
Оба сценария провоцируют на сложный код, в котором будет масса ошибок. IMHO, разумеется.
В oracle есть так называемая автономная транзакция (PRAGMA AUTONOMOUS_TRANSACTION), так вот в ее контексте можно писать независимо от того чем завершилась внешняя транзакция. Я таким образом логировал все ошибки пользователей в независимости от результатов внешней транзакции. Удобно. Не надо это делать в другой транзакции.kdv писал(а):это тебе кажетсяИногда это требуется
Возможно это уже флейм, то для логирования очень хорошо подходят external tables.Лысый писал(а):В oracle есть так называемая автономная транзакция (PRAGMA AUTONOMOUS_TRANSACTION), так вот в ее контексте можно писать независимо от того чем завершилась внешняя транзакция. Я таким образом логировал все ошибки пользователей в независимости от результатов внешней транзакции. Удобно. Не надо это делать в другой транзакции.kdv писал(а):это тебе кажетсяИногда это требуется
Отправляемся читать про external tables. Что для целей тупого тотального логирования ещё удобней. Надоел этот лог - сбросил его в другое место или в корзину и подложил свежую болванку. Не надо о мусоре думать, о росте базы со скоростью звука и сопутствующих проблемах backup/restore. А стремление писать вне контекста транзакции в саму базу, а также коммитить или роллбачить часть изменений внутри оператора (вызов SP - это оператор SQL, как справедливо указал kdv) говорит либо о неумении пользоваться when и suspend, либо о проблемах в консерватории. Ссылки на чужие базы-процедуры не катят, ибо по сути есть - сделано проктологически, ни о чём не задумываясь, значит теперь настоятельнейше необходимо внедрить в сервер проктологию, обеспечивающую успешную работу проктологии, внедрённой в конкретную прикладную задачу. Если идти этим путём, то сервер очень быстро превратится в огромную выгребную яму, ибо имя проктологическим прикладухам и видам заключённой в них проктологии - легион.Лысый писал(а):В oracle есть так называемая автономная транзакция (PRAGMA AUTONOMOUS_TRANSACTION), так вот в ее контексте можно писать независимо от того чем завершилась внешняя транзакция. Я таким образом логировал все ошибки пользователей в независимости от результатов внешней транзакции. Удобно. Не надо это делать в другой транзакции.