Почему DBMS_MVIEW.REFRESH имеет неявный коммит? - PullRequest
6 голосов
/ 06 мая 2009

Недавно я заметил, что вызов dbms_mview.refresh (...), который обновляет материализованные представления в Oracle, имеет неявную фиксацию.

Любые идеи, кроме "потому что это так", почему это действие имеет неявный коммит?

Ответы [ 3 ]

6 голосов
/ 06 мая 2009

По словам Тома Кайта, это связано с тем, что во время разработки было принято решение рассмотреть обновление как операцию DDL . Поскольку все операции DDL неявно фиксируются, то же самое происходит и с этой. К сожалению, он не отвечает на вопрос о том, почему они решили сделать его DDL.

2 голосов
/ 06 мая 2009

В зависимости от вашей версии Oracle и / или параметров, которые вы указываете, dbms_mview.refresh может выполнять TRUNCATE с последующей прямой загрузкой. TRUNCATE - это команда DDL, которая выдает неявную фиксацию. Прямая загрузка не требует фиксации.

Если вы используете более новую версию Oracle, я думаю, 10.2+, вы можете установить для параметра atomic_refresh значение TRUE, и он будет обновляться в рамках одной транзакции, используя стандартные команды DELETE / INSERT. Этот метод может быть немного медленнее.

0 голосов
/ 07 мая 2009

Обходной путь - выполнить вызов dbms_mview.refresh в автономной транзакции (создать процедуру PL / SQL с помощью pragma autilitary_transaction)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...