В тексте процедур оператор commit можно юзать ?

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
Juice
Сообщения: 23
Зарегистрирован: 16 фев 2005, 11:54

В тексте процедур оператор commit можно юзать ?

Сообщение Juice » 17 фев 2005, 13:34

сабж

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 17 фев 2005, 14:37

нет.

Juice
Сообщения: 23
Зарегистрирован: 16 фев 2005, 11:54

Сообщение Juice » 17 фев 2005, 15:33

Так что это получается, если я делаю инсерт или апдейт в хранимой процедуре то это до фени ?

sag
Сообщения: 116
Зарегистрирован: 02 ноя 2004, 11:42

Сообщение sag » 17 фев 2005, 16:09

то это до фени ?
Кому? Выражайся проще, пожалуйста, я не понял ничего.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 17 фев 2005, 16:29

про транзакции вообще читал? www.ibase.ru/devinfo/ibtrans.htm

starttransaction и commit/rollback делает только клиент. в процедурах-триггерах это делать без надобности.

eugeney
Сообщения: 79
Зарегистрирован: 29 окт 2004, 18:51

Сообщение eugeney » 21 фев 2005, 10:26

kdv писал(а):про транзакции вообще читал? www.ibase.ru/devinfo/ibtrans.htm

starttransaction и commit/rollback делает только клиент. в процедурах-триггерах это делать без надобности.
Дим. Иногда это требуется, и Fyracle это поддерживает. Но я согласег что использование commit в SP равнозначно попытке использования массивов.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 21 фев 2005, 10:45

Иногда это требуется
это тебе кажется :-)

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Сообщение dimitr » 21 фев 2005, 12:42

На самом деле, коммит в процедурах - это всего навсего сброс кеша и чистка сейвпойнтов. Т.е. наш commit retaining + пересоздание пустого сейвпойнт-стека процедуры в его виде на момент коммита/роллбека. Что технически сделать можно, хоть и накладно это будет. И я даже соглашусь, что иногда этого хочется. Но меня больше волнует семантика. Коммит нарушает логику обработки ошибок.

1) обработка ошибок в блоке

BEGIN
<блок 1>
COMMIT;
<блок 2>
END

в случае ошибки в блоке 2, отката первого блока не произойдет.

2) если сейвпойнты разрешены в PSQL

BEGIN
SAVEPOINT A;
COMMIT;
ROLLBACK TO SAVEPOINT A;
END

тут будет рантайм-ошибка, хотя компиляция пройдет.

Оба сценария провоцируют на сложный код, в котором будет масса ошибок. IMHO, разумеется.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 21 фев 2005, 13:47

давайте лучше сойдемся на том, что execute procedure - это оператор, а оператор должен быть атомарным (этот или любой другой). то есть, никаких commit/rollback внутри быть не должно по определению. И если мы с этим согласимся, то будем жить долго и счастливо.

eugeney
Сообщения: 79
Зарегистрирован: 29 окт 2004, 18:51

Сообщение eugeney » 21 фев 2005, 16:18

kdv писал(а):
Иногда это требуется
это тебе кажется :-)
Нет реальный опыт :-(
На самом деле если БД проектируется правильно, то ни вкоем случае не стоит делать глупые подхода. Но в ситуации когда БД со структурой унаследованна от когото еще то увы от этого ни куда не дется.
Прямой случай с Сompiere и Fyracle.

eugeney
Сообщения: 79
Зарегистрирован: 29 окт 2004, 18:51

Сообщение eugeney » 21 фев 2005, 16:25

dimitr писал(а):На самом деле, коммит в процедурах - это всего навсего сброс кеша и чистка сейвпойнтов. Т.е. наш commit retaining + пересоздание пустого сейвпойнт-стека процедуры в его виде на момент коммита/роллбека. Что технически сделать можно, хоть и накладно это будет. И я даже соглашусь, что иногда этого хочется. Но меня больше волнует семантика. Коммит нарушает логику обработки ошибок.
Вот это да, гдетолько народ такую траву берет :-/ ?
dimitr писал(а):1) обработка ошибок в блоке

BEGIN
<блок 1>
COMMIT;
<блок 2>
END

в случае ошибки в блоке 2, отката первого блока не произойдет.
Вполне мирно решается способом
BEGIN
<блок 1>
WHEN errors DO
<блок 2>
END
dimitr писал(а): 2) если сейвпойнты разрешены в PSQL

BEGIN
SAVEPOINT A;
COMMIT;
ROLLBACK TO SAVEPOINT A;
END

тут будет рантайм-ошибка, хотя компиляция пройдет.

Оба сценария провоцируют на сложный код, в котором будет масса ошибок. IMHO, разумеется.
Не это к практологу, человек выдумывает потом решет задачу и в итоге 8-0. Рельно в жызни то что написал Кузменко Д.

Лысый
Сообщения: 177
Зарегистрирован: 08 ноя 2004, 08:20

Сообщение Лысый » 21 фев 2005, 17:16

kdv писал(а):
Иногда это требуется
это тебе кажется :-)
В oracle есть так называемая автономная транзакция (PRAGMA AUTONOMOUS_TRANSACTION), так вот в ее контексте можно писать независимо от того чем завершилась внешняя транзакция. Я таким образом логировал все ошибки пользователей в независимости от результатов внешней транзакции. Удобно. Не надо это делать в другой транзакции.

eugeney
Сообщения: 79
Зарегистрирован: 29 окт 2004, 18:51

Сообщение eugeney » 21 фев 2005, 17:27

Лысый писал(а):
kdv писал(а):
Иногда это требуется
это тебе кажется :-)
В oracle есть так называемая автономная транзакция (PRAGMA AUTONOMOUS_TRANSACTION), так вот в ее контексте можно писать независимо от того чем завершилась внешняя транзакция. Я таким образом логировал все ошибки пользователей в независимости от результатов внешней транзакции. Удобно. Не надо это делать в другой транзакции.
Возможно это уже флейм, то для логирования очень хорошо подходят external tables.

Все задачи можно решить немного другим способом :-)

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 21 фев 2005, 17:50

Лысый писал(а):В oracle есть так называемая автономная транзакция (PRAGMA AUTONOMOUS_TRANSACTION), так вот в ее контексте можно писать независимо от того чем завершилась внешняя транзакция. Я таким образом логировал все ошибки пользователей в независимости от результатов внешней транзакции. Удобно. Не надо это делать в другой транзакции.
Отправляемся читать про external tables. Что для целей тупого тотального логирования ещё удобней. Надоел этот лог - сбросил его в другое место или в корзину и подложил свежую болванку. Не надо о мусоре думать, о росте базы со скоростью звука и сопутствующих проблемах backup/restore. А стремление писать вне контекста транзакции в саму базу, а также коммитить или роллбачить часть изменений внутри оператора (вызов SP - это оператор SQL, как справедливо указал kdv) говорит либо о неумении пользоваться when и suspend, либо о проблемах в консерватории. Ссылки на чужие базы-процедуры не катят, ибо по сути есть - сделано проктологически, ни о чём не задумываясь, значит теперь настоятельнейше необходимо внедрить в сервер проктологию, обеспечивающую успешную работу проктологии, внедрённой в конкретную прикладную задачу. Если идти этим путём, то сервер очень быстро превратится в огромную выгребную яму, ибо имя проктологическим прикладухам и видам заключённой в них проктологии - легион.

Лысый
Сообщения: 177
Зарегистрирован: 08 ноя 2004, 08:20

Сообщение Лысый » 23 фев 2005, 09:46

>Merlin
Спорить на эту тему не буду (external tables для логов - руль) :) И предлагать ввести commit тоже не буду. Я просто ответил, что бывают случаи когда это могло бы пригодиться. Я пользовался тем что предоставлял Oracle, нет такого в FB - решу другим способом.

P.S. Кстати я не очень хорошо описал свое решение в предыдущем топике. На самом деле в лог попадали только уникальные ошибки. Я собирал их для русификации сообщений (именованные констрейнты + таблица с рус.сообщениями). Так что лог не был безразмерным.

Ответить