我最近注意到调用dbms_mview.refresh(...),它刷新了Oracle中的物化视图,它有一个隐式提交。
任何想法 - 除了“因为它确实” - 为什么这个动作有一个隐含的提交?
答案 0 :(得分:6)
据汤姆·基特说,这是因为a decision was made at design time to consider refreshing to be a DDL operation。由于所有DDL操作都隐式提交,因此这个操作也是如此。不幸的是,他没有回答为什么他们选择让它成为DDL的问题。
答案 1 :(得分:2)
根据您的Oracle版本和/或您提供的参数,dbms_mview.refresh可能正在执行TRUNCATE,然后是直接加载。 TRUNCATE是一个DDL命令,因此发出一个隐式提交。直接加载不需要提交。
如果您使用的是更新版本的Oracle,我认为10.2+,您可以将atomic_refresh参数设置为TRUE,它将使用标准DELETE / INSERT在单个事务中刷新。这种方法可能会慢得多。
答案 2 :(得分:0)
work arround是在自治事务中调用dbms_mview.refresh(使用pragma autonomous_transaction创建PL / SQL过程)。