【问题标题】:Why does DBMS_MVIEW.REFRESH have an implicit commit?为什么 DBMS_MVIEW.REFRESH 有隐式提交?
【发布时间】:2010-10-24 03:40:50
【问题描述】:

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

除了“因为它确实”之外的任何想法 - 为什么此操作具有隐式提交?

【问题讨论】:

  • 您使用的是哪个版本的 Oracle?

标签: oracle transactions materialized-views


【解决方案1】:

根据 Tom Kyte 的说法,这是因为 a decision was made at design time to consider refreshing to be a DDL operation。由于所有 DDL 操作都隐式提交,所以这个也是。不幸的是,他没有回答他们为什么选择将其制作为 DDL 的问题。

【讨论】:

  • Tom 很棒,但他确实倾向于抛出这些“因为它确实”的答案。
  • 是的,他会,而且他们通常会回答其他人也无法回答的问题。
【解决方案2】:

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

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

【讨论】:

  • 即使 atomic_refresh 为真时也会完成隐式提交,但您对 TRUNCATE/DELETE 行为是正确的。
  • 是的 - 我想隐式提交使行为保持一致,无论刷新机制如何。
【解决方案3】:

解决方法是在自治事务中调用 dbms_mview.refresh(使用 pragma automatic_transaction 创建一个 PL/SQL 过程)。

【讨论】:

  • 不是在这种情况下,如果刷新的视图本身被搞砸了,我希望能够回滚刷新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
相关资源
最近更新 更多