我最近注意到调用dbms_mview.refresh(...),它刷新了Oracle中的物化视图,它有一个隐式提交。

任何想法 - 除了“因为它确实” - 为什么这个动作有隐式提交?

有帮助吗?

解决方案

根据您的Oracle版本和/或您提供的参数,dbms_mview.refresh可能正在执行TRUNCATE,然后是直接加载。 TRUNCATE是一个DDL命令,因此发出一个隐式提交。直接加载不需要提交。

如果您使用的是更新版本的Oracle,我认为10.2+,您可以将atomic_refresh参数设置为TRUE,它将使用标准DELETE / INSERT在单个事务中刷新。这种方法可能会慢得多。

其他提示

根据Tom Kyte的说法,这是因为在设计时决定将刷新视为DDL操作。由于所有DDL操作都隐式提交,因此这个操作也是如此。不幸的是,他没有回答为什么他们选择让它成为DDL的问题。

work arround是在自治事务中调用dbms_mview.refresh(使用pragma autonomous_transaction创建PL / SQL过程)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top