Почему DBMS_MVIEW.REFRESH имеет неявный коммит?
-
06-07-2019 - |
Вопрос
Недавно я заметил, что вызов dbms_mview.refresh (...), который обновляет материализованные представления в Oracle, имеет неявную фиксацию.
Любые идеи, кроме " потому что они есть " - почему это действие имеет неявный коммит?
Решение
В зависимости от вашей версии Oracle и / или параметров, которые вы указываете, dbms_mview.refresh может выполнять TRUNCATE с последующей прямой загрузкой. TRUNCATE - это команда DDL, которая выдает неявную фиксацию. Прямая загрузка не требует фиксации.
Если вы используете более свежую версию Oracle, я думаю, что 10.2+, вы можете установить для параметра atomic_refresh значение TRUE, и он будет обновляться в рамках одной транзакции, используя стандартные DELETE / INSERT. Этот метод может быть немного медленнее.
Другие советы
По словам Тома Кайта, это потому, что во время разработки было принято решение рассматривать обновление как операцию DDL . Поскольку все операции DDL неявно фиксируются, то же самое происходит и с этой. К сожалению, он не отвечает на итоговый вопрос о том, почему они решили сделать его DDL.
Обходным решением является выполнение вызова dbms_mview.refresh в автономной транзакции (создайте процедуру PL / SQL с помощью pragma autilitary_transaction). Р>