Seata1.5.1 分布式事务 demo 整合 Nacos 2.1.0 + Mysql8.0.29的踩坑总结

配置版本:

seata版本:1.5.1

配置中心/注册中心:Nacos 2.1.0

数据库: Mysql 8.0.29

jdk:1.8

SpringCloudAlibaba: 2021.0.1.0

SpringCloud: 2021.0.3

SpringBoot: 2.7.1

Mybatis: 3.5.9


概念上的踩坑

Seata分为服务端和客户端

服务端(Seata服务)部署的是TC(事务协调者),用于维护全局和分支事务的状态,驱动全局事务提交或回滚。

客户端(代码端、微服务端)部署的TM (事务管理器)  、RM (资源管理器) 

Seata服务端需要注册到注册中心,这样才能管理注册中心上面的不同微服务的事务,所以需要注册中心

但是为啥需要配置中心?这个刚开始的时候很难理解,后面当我配置完之后,我明白了

Seata的服务端配置seata服务端目录的conf/application.yml文件里的部分参数

Seata的客户端配置微服务项目里面application.yml里面相关Seata客户端的部分参数

可以直接绑定到配置中心上面的某个properties文件,这样可以减少本地参数配置,也可以方便参数的修改,直接修改配置中心里面对应的properties文件就可以,  服务端和客户端也可以使用同一个properties文件


配置过程遇到的坑和注意点

上图是我配置的Seata分布式事务demo

1.首先Seata1.5.1很方便, 不需要file.conf,registry.conf,直接使用yml即可

Seat服务的conf文件夹里面也只有application.yml

 而微服务端也只要配置springboot的application.yml的参数即可

2.Seata相关的配置信息参考以及sql脚本请到对应版本的Git仓库下载

比如,我这次用的1.5.1

 去下载Seata1.5.1源码包里面,script文件夹里面有服务端,客户端的具体配置参考和sql脚本

 如果sql脚本建的库表对不上,或者配置没对上,那就坑了呀

3.Seata默认的数据库连接用的mysql5.7如果需要改成mysql8,替换jar千万注意别压缩

官网上写了替换mysql驱动,但在添加替换jar的时候,压缩方式选择存储

4.客户端与服务端的配置的对应关系


 代码实现上遇到的坑

下订单(事务A)  ->        减库存(事务B)

如果是2个分布式事务的情况下都能正常执行或者回滚

然而,3个分布式事务的时候就碰到个问题

下订单(事务A)  ->        减库存(事务B)        ->        扣存款(事务C)(执行完后异常

发现事务C和事务A都回滚了,B一直没回滚, XID也没有丢失,

我原先的写法是在事务A方法里面

@GlobalTransactional
@Transactional(rollbackFor = Exception.class,propagation= Propagation.REQUIRED)
public CommResult test(Order order){
    
    //第一个事务sql
    orderMapper.downOrder(order);

    //feign接口调用第二个事务
    seataStockService.reduceStockNum(order);

    //feign接口调用第三个事务
    seataAccountService.reduceAccountMoney(order);    

}

这样写就是B回滚不了

@GlobalTransactional
@Transactional(rollbackFor = Exception.class,propagation= Propagation.REQUIRED)
public CommResult test(Order order){

    //第一个事务sql
    orderMapper.downOrder(order);
    
    //feign接口调用第二个事务
    //我在这个feign接口里面调用了第三个事务
    seataStockService.reduceStockNum(order);

}

后面改成这样写,就可以了

最后感谢Seata, end~~~

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值