手写XA分布式事务和Spring事务框架整合

这里是自实现XA分布式事务和ORM框架spring事务框架的整合
与Spring事务结合,分布式事务注解同普通事务@Transactional,于Spring事务AOP框架一体
如果对XA事务本身不了解,可以参考下我另一片博文 XA分布式事务全面理解

整体思路:

  1. 事务管理器:使用JtaTransactionManager,自实现其依赖的事务管理器UserTransactionManagerUserTransactionManager中进行对分布式事务的begin、commit、rollback、事务状态等的管理,Spring会通过JtaTransactionManager去调用自定义的事务管理器UserTransactionManager以实现对分布式事务的管理。
  2. 开启XA事务:xa start。找到一个好的时机点,去开启XA事务,可以在ORM框架在获取连接对象connection时,先对xa的connection对象进行开启,再返回连接对象。
  3. 执行具体的DML操作:这部分ORM框架的职责,我们不需要干涉
  4. 关闭XA事务:xa end。需要一个时机去关闭XA事务,在ORM框架中的statement#execute()执行结束时去进行关闭end事务

以上2-4是不同数据源下的Connection对象获取时,都要进行的。

  1. 整个分布式事务提交:由Spring 事务框架可知,先会走到Spring的TransactionInterceptor#invoke() ,invoke() 会对注解了@Transactional的方法进行分布式事务的begin、调用方法、异常rollback、正常commit的整体流程管理。但最终正常commit还是会走到我们自定义的JtaTransactionManagerUserTransactionManager#commit()方法中;若异常rollback会走到JtaTransactionManagerUserTransactionManager#rollback()方法中。所以这里的重点就是实现UserTransactionManager的commit()和rollback()方法。
  2. commit:XA分布式事务commit和普通事务commit不同,在真正的commit之前需要先prepare拿到所有参与分布事务的RM的反馈。在所有RM的prepare成功时,再依次commit提交事务。
  3. rollback:若在5中,DML调用方法异常,会先进入Spring事务异常处理的rollback,再调用UserTransactionManager的rollback()。而分布式的rollback同普通事务的rollback()一样都是只对所有连接对象依次进行回滚操作即可。只是普通事务只是对一个数据库的连接对象的回滚,分布式事务是依次对所有的数据库连接对象进行回滚。

代码展示与解析:

这里会对上述的7个顺序的步骤分别给出一个代码的展示

Service层代码:分布式事务注解

这里分布式事务注解同Spring普通事务注解方式

@Transactional(rollbackFor = RuntimeException.class)
  public Integer saveArea(ConsultConfigArea area) {

    int count = mapper1.addArea(area);
    int count1 = mapper2.addArea(area);
    if (true){                       // 这里用于抛出异常测试
      System.out.println("rollback");
      throw new RuntimeException("xx");
    }
    return count + count1;
  }


  • 注解了@Transactional(rollbackFor = RuntimeException.class)就是该方法使用分布式XA事务
  • mapper1、mapper2的数据源对应不同数据库

JtaTransactionManager & 自定义UserTransactionManager

1. JtaTransactionManager

@Configuration
public class GlobalConfig {

    @Bean
    @ConditionalOnMissingBean(TransactionManager.class)
    LocalUserTransactionManager localTransactionManager() t
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
分布式事务是指跨多个数据库或服务的事务操作,保证数据一致性和可靠性。在 Java手写分布式事务可以使用以下几种方式实现: 1. 两阶段提交(2PC):在分布式环境中,协调者(通常是一个中心节点)与参与者(各个分布式节点)进行协调来保证事务的一致性。具体实现中,需要定义协议、消息的传递和处理等。这种方式实现相对复杂,但能够保证数据的强一致性。 2. 补偿事务(TCC):通过预先定义事务的 try、confirm 和 cancel 三个阶段,来实现自动或手动进行事务的补偿。如果某个参与者失败,则可以通过 cancel 阶段回滚之前的操作。这种方式实现相对简单,但可能会引入一定的不一致性。 3. 消息队列:使用消息队列可以将分布式事务拆解为独立的事务操作,并通过消息中间件来保证最终一致性。具体实现中,可以使用事务消息或者可靠消息传递机制,确保消息的可靠传递和处理。 4. 分布式锁:使用分布式锁可以在分布式环境下保证对共享资源的互斥访问。通过获取锁来进行事务操作,可以保证在同一时刻只有一个节点能够执行某个操作,从而保证数据的一致性。 需要注意的是,手写分布式事务比较复杂且易出现问题,建议使用成熟的分布式事务框架或者中间件,如 Spring Cloud、Atomikos、Seata 等来简化开发和保证数据一致性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值