【发布时间】:2010-10-24 03:40:50
【问题描述】:
我最近注意到调用 dbms_mview.refresh(...) 会刷新 Oracle 中的物化视图,它具有隐式提交。
除了“因为它确实”之外的任何想法 - 为什么此操作具有隐式提交?
【问题讨论】:
-
您使用的是哪个版本的 Oracle?
标签: oracle transactions materialized-views
我最近注意到调用 dbms_mview.refresh(...) 会刷新 Oracle 中的物化视图,它具有隐式提交。
除了“因为它确实”之外的任何想法 - 为什么此操作具有隐式提交?
【问题讨论】:
标签: oracle transactions materialized-views
根据 Tom Kyte 的说法,这是因为 a decision was made at design time to consider refreshing to be a DDL operation。由于所有 DDL 操作都隐式提交,所以这个也是。不幸的是,他没有回答他们为什么选择将其制作为 DDL 的问题。
【讨论】:
根据您的 Oracle 版本和/或您提供的参数,dbms_mview.refresh 可能会执行 TRUNCATE,然后是直接加载。 TRUNCATE 是一个 DDL 命令,因此发出一个隐式提交。直接加载不需要提交。
如果您使用的是更新版本的 Oracle,我认为是 10.2+,您可以将 atomic_refresh 参数设置为 TRUE,它会在单个事务中使用标准的 DELETE / INSERT 刷新。不过这种方法可能会慢一些。
【讨论】:
解决方法是在自治事务中调用 dbms_mview.refresh(使用 pragma automatic_transaction 创建一个 PL/SQL 过程)。
【讨论】: