Вопрос

Недавно я заметил, что вызов 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).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top