项目中XA Transaction应用

来源:互联网 发布:淘宝客独家是什么意思 编辑:程序博客网 时间:2024/06/05 02:19

和新同事介绍JEE事务的时候,大家对JPA和JTA的理解不够。这里聊聊有JPA后为什么还要JTA。JPA是大家常用的持久化规范,它提供了事务管理。它的事务处理都是单资源事务,那么事务是否成功,是否需要回滚就是一件比较简单的事情,只要和单资源交互就好。一个典型的数据库资源事务基本步骤如下:

开启事务执行事务确认事务结果(提交或者回滚)结束事务

简单的单资源事务, Local Transactions.,JPA就已经支持。在我们的项目中,有一个计价过程需要同时操作数据库和MQ两种资源(写入数据到MQ然后记录状态到数据库)。这个时候就需要XA,Global Transactions, JTA提供了相应的支持。在我们的系统中,一个XA的过程如下:

成功交互顺序:开启消息事务发送消息开启数据库事务更新数据库提交数据库事务提交消息事务如果出错,比如数据库出错,交互过程如下:开启消息事务发送消息开启数据库事务更新数据库失败回滚数据库事务回滚消息事务

Spring JTA的实现非常好,JtaTransactionManager帮助我们屏蔽了底下的细节,结合Atomikos给我们提供了非JEE容器依赖的XA实现, JtaTransactionManager子类WebLogicJtaTransactionManager和WebSphereUowTransactionManager提供了基于Weblogic和Websphere的JTA管理。在我们的系统中用的是websphere,所以我们配置了基于WebSphereUowTransactionManager的事务管理。

<bean id="txManager" class="org.springframework.transaction.jta.WebSphereUowTransactionManager" /><tx:annotation-driven transaction-manager="txManager"/>

更详细的实现例子可以参考IBM文档:http://www.ibm.com/developerworks/websphere/techjournal/0609_alcott/0609_alcott.html

JTA使用后对我们的系统产生了一定的性能影响,所以最后我们简化了系统的实现,直接改成2个单事务来处理,因为数据库记录是否成功对我们系统的影响不大,最多导致MQ消息重复处理一次。

开启消息事务发送消息提交消息事务开启数据库事务更新数据库提交数据库事务

参考资料:two-phase commit
three-phase commit。
JEE中XA经典讲解

0 0
原创粉丝点击