项目中XA Transaction应用

    xiaoxiao2025-05-02  11

    和新同事介绍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经典讲解

    转载请注明原文地址: https://ju.6miu.com/read-1298684.html
    最新回复(0)