• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

项目中XA Transaction应用

java 来源:开心的D哥 8次浏览

和新同事介绍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)