【问题标题】:Can a query from an Oracle to a DB2 through a dblink block the DB2 table?通过 dblink 从 Oracle 到 DB2 的查询会阻塞 DB2 表吗?
【发布时间】:2012-09-05 23:58:54
【问题描述】:

我有一个中等规模的查询,其中包含 500.000 个寄存器,通过 DBLink 从 Oracle 到 DB2 系统。此查询能否阻止 DB2 表,以便在我关闭 DBLink 或完成查询作业(插入选择到 Oracle 表中)之前对其进行更新

【问题讨论】:

  • 你的意思是“可以更新”还是“不能更新”?
  • 我希望 DB2 表不被阻塞,以便在我完成工作时更新它(oracle 表中的插入选择)

标签: oracle db2 blocking


【解决方案1】:

DB2 引擎将 DBLink 视为正在执行选择语句的远程应用程序。如果该应用程序使用游标稳定性 (CS) 或类似的合理隔离级别,那么 DB2 数据库不应长时间锁定任何行。当来自 DBLink 的游标遍历 DB2 查询的结果集时,最多可能存在一系列非常短的行级锁。如果 DBLink 没有改变 DB2 端的东西,那么 DB2 中不应该出现任何明显的锁定,因此其他应用程序应该能够连接到 DB2 以执行更新。如果我对您的问题有误解,请告诉我,我会澄清我的答案。

【讨论】:

  • 您能告诉我如何检查游标稳定性或定义到 DBLINK 的隔离级别吗? (我还没有创建 dblink,我看不到它是如何定义的,但我想减轻 DBA 的工作)
【解决方案2】:

似乎可以通过 Oracle dblinks 使用选择来阻止表,因为将 DBLINK 定义为 READ UNCOMMITED 是不可能的,但是可以使用另一个支持该功能的数据库系统(例如 SQLServer)来解决该问题。这就是本论坛最后一篇文章所说的:

Forum

“即使通过 DB_LINK 从外部数据库中选择数据,也无法设置或欺骗 oracle 以未提交的读取进行选择

我们为解决这个问题所做的是绕过 oracle 的 odbc 驱动程序以一起进行,因为在选择 DB_LINK 时,即使我们将事务设置为只读,进度方面的任何锁定列都会为我们炸毁。

我们改为使用 SQLServer 作为 ORACLE 和 Progress 之间的缓冲区。使用 SQLServer,您可以将隔离级别设置为未提交的读取。所以我们通过 SQLServer Linked 服务器创建了进度表的 SQLServer 视图,然后我们从这些视图中选择从 oracle 到 SQLServer 的 DB_Link。

这似乎工作正常”

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    • 2021-02-24
    相关资源
    最近更新 更多