【问题标题】:Can full information about an Oracle schema data-model be selected atomically?可以自动选择有关 Oracle 模式数据模型的完整信息吗?
【发布时间】:2014-05-20 09:58:32
【问题描述】:

我正在使用 OCI 在 C/C++ 中以自定义 Table/Column/Constraint/Index 数据结构实例化 Oracle Schema 数据模型的客户端表示。为此,我选择:

  • all_tables
  • all_tab_cmets
  • all_col_cmets
  • all_cons_columns
  • all_constraints
  • 等等...

然后我使用 OCI 来描述所有表,以获取有关列类型的精确信息。这是可行的,但我们的 CI 测试场在此模式数据模型自省代码中经常失败,因为另一个测试正在并行运行,并在这一系列查询和 describe 中间创建/删除表我正在拨打的电话。

因此,我的问题是我如何原子地内省这个架构,以便另一个会话不会同时改变我正在内省的那个架构?

在选择和描述周围使用只读可序列化事务就足够了吗? IE。 MVCC 是否适用于 Oracle 的数据字典?此类系统词典出现SnapShot too Old 错误的可能性有多大?

如果不可能实现完整的原子性,我可以采取哪些步骤来最大程度地减少获得不一致/陈旧信息的可能性?

我在想可能是左连接以减少查询数量,和/或将 OCIDescribeAny() 调用替换为连接到其他表的其他字典访问,以便在单个查询中获取所有表/列信息?

对于这个并发问题,我不胜感激。谢谢,--DD

【问题讨论】:

    标签: oracle oracle-call-interface


    【解决方案1】:

    典型的读写冲突。从我的头顶上,我看到了两种方法:

    1. 在“自省”和“另一个测试”中都使用dbms_lock 包。
    2. 重写您的追溯查询,使其返回您需要的一件大事。有多种方法可以做到这一点:
      1. 使用xmlagg 等。
      2. 使用 listagg 并获得一个大字符串或 clob。
      3. 只需使用一堆联合来获得一个结果集,因为它可以保证是一致的。

    希望有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-01-02
      • 2013-01-23
      • 1970-01-01
      • 2017-04-21
      • 2018-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多