为什么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在单个事务中刷新。这种方法可能会慢得多。
其他提示
根据Tom Kyte的说法,这是因为在设计时决定将刷新视为DDL操作。由于所有DDL操作都隐式提交,因此这个操作也是如此。不幸的是,他没有回答为什么他们选择让它成为DDL的问题。
work arround是在自治事务中调用dbms_mview.refresh(使用pragma autonomous_transaction创建PL / SQL过程)。
不隶属于 StackOverflow