快速业务通道

oc4j+toplink+spring使用jta外部事务的一点心得 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-15

oc4j+toplink+spring使用jta外部事务的一点心得

时间:2011-07-29 叱咤红人

晚上要下班的时候,application team那里使用Tibco EMS做消息集成服务时候出了bug,错误是: java.sql.SQLException: 当全局事务处理处于活动状态时, 无法调用方法 ''commit'',应该是在全局事务 中使用了本地事务并提交了。帮忙看了一下,它的oc4j, toplink, spring的使用上都存在着一些问题, 并把要注意的地方总结了一下。

Jta外部事务,也称为分布式事务,全局事务。

oc4j:

·让transaction manager知道resource的存在

要使用外部事务,首先要让transaction manager了解是哪个resource。我们选择使用managed resource,这样由容器来管理:data source, jms resouce, jca resource,oc4j的transaction manager 肯定是知道这些managed resource的存在的,可以通过ra,data-sources.xml来配置,或者直接通过oc4j web console来创建。

Oc4j data-sources.xml

特别要注意的是data source的设置,oc4j中可以通过data-sources.xml设置transaction level,默 认是global,表示join jta外部事务,如果是local,oc4j就会把所有的managed datasource的操作当作 local connection来看待,这些操作是不join到外部事务中的。

什么是一次local transaction操作呢?

Toplink:每次对unitofwork的提交。

Connection的每次提交,auto commit的每次操作。

   <managed-data-source name="MIFSystemLogDataSource"       connection-pool-name="MIFSysLogConnectionFactory"       jndi-name="jdbc/mifStatusLog" tx-level=''global''/>

有人会问没有使用xa的connection怎么能使用外部事务join transaction呢,oracle实现了称为 Emulating XA(oc4j container),它基本上模拟了two phase commit的功能,但是没有transaction branches,也就是xid的branch标识符,xid包括format标识符, global事务标识符和branch标识符。也 没有two phase commit的预提交过程。Toplink在使用session broker时,也有类似的配置,称为two stage commit。xa的resource应该配置成global的transaction,否则没必要用xa。

Oc4j中如何自己控制transaction

有时我们可能需要自己控制transaction,这样我们可能需要在oc4j中获得受管的UserTransaction和 TransactionManager,TransactionManager可以suspend和resume一个transaction,实现诸如requires new这样的功能。

   Context initialContext = new InitialContext();     UserTransaction userTrx = (javax.transaction.UserTransaction) initialContext.lookup("java:comp/UserTransaction");        if (ut instanceof TransactionManager) {              TransactionManager tm = (TransactionManager) userTrx; }

如果使用的是分布式全局transaction不建议在程序中调用connection.setAutoCommit(true), connection.commit(), commit.rollback()方法,这样会干扰分布式事务的管理。

oc4j+toplink+spring使用jta外部事务的一点心得(2)

时间:2011-07-29 叱咤红人

2.Toplink

如果toplink需要跨多个data source,请使用session broker

<session> <name>EmployeeSession</name> ... </session> <session> <name>ProjectSession</name> ... </session> /* Configure the SessionBroker */ <session-broker> /* Name the SessionBroker */ <name>EmployeeAndProjectBroker</name> /* Specify the sessions contained in the SessionBroker */ <

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号