今天我被甲骨文没有实现的成功的 2pc 击中。另一个参与者是 MSMQ,它实现得很好。
问题是我没有在应用程序中得到异常(使用 c# odp.net)。后来我在 sys.dba_2pc_pending 中找到了 In-Doubt Transactions。
我能以某种方式在我的应用程序中检测到这一点吗?
编辑:这不是让 2pc 工作。它确实有效,并且持续了一年多,直到有一天某些行丢失。请阅读 In-Doubt Oracle 事务链接1和待处理事务链接 2
我的第一个想法是确保在 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 将服务标记为分布式事务处理;默认为假。企业管理器使您可以在集群托管数据库服务:创建服务或修改服务页面上设置此参数。您还可以使用 DBMS_SERVICE 包来修改单例服务的 DTP 属性,如下所示:
执行 DBMS_SERVICE.MODIFY_SERVICE(service_name =>'xa_01.service.us.oracle.com', DTP=>TRUE);