【问题标题】:Oracle DML with 2 phase commit not materialized具有 2 阶段提交的 Oracle DML 未实现
【发布时间】:2015-02-10 11:34:13
【问题描述】:

今天我被甲骨文没有实现的成功 2pc 击中。另一个参与者是 MSMQ,它实现得很好。

问题是我在应用程序中没有收到异常(使用 c# odp.net)。后来我在 sys.dba_2pc_pending 中找到了 In-Doubt Transactions。

我能否在我的应用程序中检测到这一点?

编辑:这不是让 2pc 工作。它确实有效,并且持续了一年多,直到有一天某些行丢失。请阅读 In-Doubt Oracle 事务link1 和待处理事务link2

【问题讨论】:

  • 也许您可以向我们展示您的异常处理代码......并且您应该确保它实际上正在处理其他 ORA 错误。有一个 OracleException 类。
  • 其实并没有异常处理,因此无法吞下错误。另一个参与者(MSMQ)也确实提交得很好。逻辑在 Nservicebus 处理程序中运行。
  • 你能发布示例代码吗?我假设您正在使用 system.transaction?
  • NServicebus 使用 system.transaction,我的代码没有。我在 DTC 中使用 NHibernate/odp.net paticpanting 和由 NServicebus 创建的 MSMQ。

标签: oracle odp.net 2phase-commit


【解决方案1】:

我的第一个想法是确保在 oracle 侦听器上启用分布式事务处理。

在我的情况下,没有引发错误。我们使用 RAC,服务没有启用分布式事务处理。在独立系统中,我不确定这会做什么,但在 RAC 的情况下,它的目的是识别处理事务的主节点。没有它,本应在同一操作中的第二个操作最终会启动一个新事务并与第一个事务发生死锁。

我也有很长一段时间没有问题。幸运的是(可能还有更多),交易从未在节点上拆分。但一年后,同样的症状又出现了,在所有情况下,要么服务没有检查 DTP 标志,要么使用了错误的服务名称(一个没有 DTP)。

发件人:http://docs.oracle.com/cd/B19306_01/rac.102/b14197/hafeats.htm#BABBBCFG

为服务启用分布式事务处理 您将用于分布式事务处理, 使用 Enterprise Manager、DBCA 或 SRVCTL 创建服务,并 只定义一个实例作为首选实例。你可以有 您想要的许多 AVAILABLE 实例。例如,以下 SRVCTL 命令为数据库 crm 创建一个单例服务, xa_01.service.us.oracle.com,其首选实例为 RAC01:

srvctl 添加服务 -d crm -s xa_01.service.us.oracle.com -r RAC01 -a RAC02, RAC03

然后将服务标记为分布式事务 通过将 DTP 参数设置为 TRUE 进行处理;默认为假。 Enterprise Manager 使您可以在集群上设置此参数 托管数据库服务:创建服务或修改服务页面。你 也可以使用 DBMS_SERVICE 包修改 DTP 属性 单例服务如下:

执行 DBMS_SERVICE.MODIFY_SERVICE(service_name =>'xa_01.service.us.oracle.com', DTP=>TRUE);

【讨论】:

  • 如果未启用,您将获得异常。
  • 既然提交失败了,我们就在这里:)。我已经详细说明了我的答案。
  • 我已经添加了相关的oracle文档。
  • @ b_levitt,感谢您的努力,我很感激。 Oracle 服务器不是 RACK 并且 DTC 在应用程序级别上位于 MSMQ 和 Oracle 之间。
猜你喜欢
  • 1970-01-01
  • 2012-07-20
  • 1970-01-01
  • 2021-10-08
  • 2019-11-03
  • 2020-02-29
  • 2013-12-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多