具有2阶段提交的Oracle DML未实现

时间:2015-02-10 11:34:13

标签: oracle odp.net 2phase-commit

今天,我被一个成功的2pc击中,而这在Oracle中没有实现。另一位参与者是MSMQ,实现了很好。

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

我可以以某种方式在我的申请中检测到这一点吗?

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

的信息

1 个答案:

答案 0 :(得分:0)

我的第一个想法是确保在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 add service -d crm -s xa_01.service.us.oracle.com -r RAC01 -a   RAC02,RAC03

     

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

     

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