配置版本:
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~~~