Как стать автором
Обновить

Комментарии 22

С OCN не работал, а нельзя для этих целей использовать триггеры на таблицах? В триггере также можно вызывать процедуру или послать сообщение по сети DBMS_TCP. Какие тут минусы?
Ну, как мне кажется у любого подхода есть своя применимость. Вообще, обилие триггеров на таблицах может снизить производительность insert-ов. Код который Вы выполняете в триггере по умолчанию выполняется в той же транзакции что и insert. И в том же потоке. А здесь все сделает менеджер задач Oracle, в фоновом потоке. Еще, Вам видимо придется самостоятельно реализовать обработку сообщений, полученных из триггеров, а здесь предлагается уже готовое решение. Зато, вероятно, гибкость которую Вы получите в случае отказа от OCN будет больше. Вопрос только в том, нужна ли она.
Не совсем так. OCN построена поверх Advanced Queue которые, в свою очередь построены на обычных таблицах.
Так что производительность триггеров, которые пишут в сокет будет скорее всего ВЫШЕ чем при использовании OCN (у которого будут писаться редо логи, архив логи, undo segment и т.п.)
Проблема с триггерами и записью в сокет в том, что в оракле нет события (триггера) OnCommit, на которое можно было бы повесить обработчик (само событие вообще-то есть — materialized view умеют по OnCommit обновлятся).
Я даже где-то понимаю оракловцев мужественно терпящих висящий с 90-х годов тикет про это событие. Действительно — а что делать если в обработчике произошло исключение? делать роллбек? или все-таки коммит?
Так вот, в триггере на таблице, который пишет в сокет проблема в том, что вы не можете определить достоверность данных. Т.е. можно реализовать идиотский метод — запрашивать данные «в обратку» но тогда вы нагрузите оракл лишними запросами и достоверность не увеличите. Вы же не знаете, закончилась транзакция или нет.
Проблема с триггерами и записью в сокет в том, что в оракле нет события (триггера) OnCommit, на которое можно было бы повесить обработчик
есть очень древний подход — раньше в таких случаях делали в триггере dbms_job.submit, который должен вызвать нужную процедуру-хэндлер события. Соответственно, пока основная транзакция не делала коммит — джоб не запускался.
Тяжеловесно :) Так же как делать триггер на materialized view которая OnCommit обновляется.
И не решает проблемы обработки Rollback. Я этой задачей интересовался в попытках реализовать хранение логов изменений данных в NoSQL DB. Собственно я хотел избежать дополнительных записей в таблицы и иметь актуальные данные. При наличии обработки коммита можно только частично решить задачу.
&
И не решает проблемы обработки Rollback.
в смысле? Вообще-то как раз решают — при роллбэке джоб-хэндлер вызван не будет.
Да, но как отличить это от ситуации что транзакция еще не закончилась?
Опять не понял вопроса… Отличать что, от чего и зачем? Предполагается, что обработка нужна только для закоммиченных изменений — так она и будет запущена только для закоммиченных изменений. Для незакоммиченных ничего не будет происходить.
Либо придется весь объем данных для передачи «наружу» передавать в параметрах для джоба, что не уменьшает нагрузку на диск, либо передавать их сразу, но тогда надо знать — закончилась транзакция или нет, чтобы пометить переданные в триггере данные как закомиченные или удалить.
Если уж совсем облегчать, то надо переводить на другие механизмы типа CDC
Спасибо за ответ, про commit я действительно забыл. Но решения через dbms_job.submit очень интересное, надо записать в блокнотик :)
Так вот, в триггере на таблице, который пишет в сокет проблема в том
тут опаснее то, что любые проблемы в таком триггере скажутся на самой основной транзакции, которые зачастую стараются делать как быстрее, а все лишнее проводить в асинхронной обработке близкой к реальному времени
Абсолютно согласен. Хотя латчи самого оракла такое иногда вытворяют… и нагрузка на редологи только увеличивает вероятность.
Короче, опасности везде поджидают )
Хотя латчи самого оракла такое иногда вытворяют… и нагрузка на редологи только увеличивает вероятность.
что-то я не понял к чему было про латчи и редулоги? :) Кстати, количество латчей в оракле все уменьшается и уменьшается — все больше механизмов переводится на мьютексы.
К тому, что иногда оракл сам задумывается так, что можно через сокет полбазы перелить.
Значит что-то в консерватории не так — анализируйте-тюньте :)
Чудеса, если у вас такого не случается :)
у меня работа такая :)
Я даже где-то понимаю оракловцев мужественно терпящих висящий с 90-х годов тикет про это событие.

Почему бы им не сделать 2 события: beforecommit — ошибка бы откатывала и aftercommit — ошибка не откатывала.
Вообще хватило бы и одного aftercommit.
потому, что подавляющее большинство приложений не ожидают никаких откатов при выполнении commit — один из ответов.
Правда есть есть deffered constraints которые могут commit отменить.
Про все это уже в металинке и форумах 1000 раз обсуждено, но события нет.
Можно, конечно, но не в лоб, т.к.могут быть и роллбэки
Триггеры в большинстве случаев «забываются» разработчиками, особенно если не они их писали :)
Кстати, если в БД логика вынесена в plsql, то можно еще использовать стандартные пакеты dbms_pipe и dbms_alert. Естественно, соответствующий код надо прописать ручками, зато функционал потенциально интереснее.
В одной из систем (2-звенка) перед установкой патча на БД выгоняли пользователей из приложения через алерты.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории