我有一个中等规模的查询,其中包含从 Oracle 通过 DBLink 到 DB2 系统的 500.000 个寄存器。此查询是否可以阻止 DB2 表,以便可以更新它,直到我关闭 DBLink 或直到我完成查询的工作(插入选择到 Oracle 表中)
2 回答
DB2 引擎将 DBLink 视为正在执行选择语句的远程应用程序。如果该应用程序使用游标稳定性 (CS) 或类似的合理隔离级别,那么 DB2 数据库不应长时间锁定任何行。当来自 DBLink 的游标遍历 DB2 查询的结果集时,最多可能存在一系列非常短的行级锁。如果 DBLink 没有改变 DB2 端的东西,那么 DB2 中不应该出现任何明显的锁定,因此其他应用程序应该能够连接到 DB2 以执行更新。如果我对您的问题有误解,请告诉我,我会澄清我的答案。
似乎可以通过 Oracle dblinks 使用选择来阻止表,因为将 DBLINK 定义为 READ UNCOMMITED 是不可能的,但是可以通过另一个支持该功能的数据库系统(例如 SQLServer)来解决该问题。这就是这个论坛的最后一个帖子所说的:
“即使通过 DB_LINK 从外部数据库中选择数据,也无法设置或欺骗 oracle 选择未提交的读取
为了解决这个问题,我们所做的就是绕过 oracle 的 odbc 驱动程序以一起进行,因为在选择 DB_LINK 时,即使我们将事务设置为只读,进度方面的任何锁定列都会为我们炸毁。
我们改为使用 SQLServer 作为 ORACLE 和 Progress 之间的缓冲区。使用 SQLServer,您可以将隔离级别设置为未提交的读取。因此,我们通过 SQLServer Linked 服务器创建了进度表的 SQLServer 视图,然后我们从这些视图中选择从 oracle 到 SQLServer 的 DB_Link。
这似乎工作正常”