2009-05-06 9 views
4

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

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

+0

Какую версию Oracle вы используете? – David

+0

Я использую Oracle 10g (10.2) –

ответ

1

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

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

+1

Неявная фиксация выполняется даже тогда, когда значение atom_refresh истинно, но вы правы в поведении TRUNCATE/DELETE. –

+0

Спасибо за разъяснение. – David

+0

Yep - Я предполагаю, что неявное commit делает поведение согласованным независимо от механизма обновления. –

4

По словам Тома Ките, это потому, что a decision was made at design time to consider refreshing to be a DDL operation. Поскольку все операции DDL неявно совершают, то и делает это. К несчастью, он не отвечает на возникающий вопрос о том, почему они решили сделать это DDL.

+0

Том замечательный, но он, как правило, выбрасывает эти ответы «потому что это так». –

+0

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

0

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

+0

Не в этом случае я хотел иметь возможность отката обновления, если обновленное представление было завинчено. –