微服务兴起,分布式事务也成为亟需解决的难题,业界解决方案很多,今天介绍一个我目前觉得最好用的TX-LCN。
官网地址:http://www.txlcn.org/zh-cn/
一、TX-LCN介绍
![fe2e21096eb64237778d333ae8c1f8ff.png](https://img-blog.csdnimg.cn/img_convert/fe2e21096eb64237778d333ae8c1f8ff.png)
![f2120bb0ac77c4a23c177d712112791b.png](https://img-blog.csdnimg.cn/img_convert/f2120bb0ac77c4a23c177d712112791b.png)
![770b84c80fef6c123be0a8f4b376c078.png](https://img-blog.csdnimg.cn/img_convert/770b84c80fef6c123be0a8f4b376c078.png)
TX-LCN由两大模块组成, TxClient、TxManager,TxClient就是你自己的服务,TxManager作为分布式事务的服务端。事务发起方或者参与反都由TxClient端来控制。
ServerA调用ServerB,同属于一个共同业务逻辑,比如买东西的业务流程:下单(订单服务)-扣除钱包金额(钱包服务)-减库存(库存服务),涉及到3个服务的调用,这个买东西的操作,下单-扣钱-减库存三个操作必须保证原子性。这里涉及到3个服务怎么保证原子性呢?
TX-LCN是这样处理的:
ServerA(事务发起方)发起调用时,创建一个事务组,会生成一个唯一的GroupId,这个GroupId会顺着服务调用链传递,每调用一个参与方服务,就会把这个参与方的事务信息通知给TxManager,加入该事务组。发起方收到调用返回(有可能是成功执行或者报错),将发起方执行结果状态通知给TxManager,TxManager将根据事务最终状态和事务组的信息来通知相应的参与模块提交或回滚事务,并返回结果给事务发起方。
二、版本说明
本文主要环境及依赖版本:
JDK8
SpringBoot - 2.1.5.RELEASE
SpringCloud - Greenwich.SR1
Spring-cloud-alibaba-dependencies - 0.9.0.RELEASE
TX-LCN - 5.0.2.RELEASE
整合的Spring-cloud-alibaba,注册中心用的Nacos,TX-LCN官网只有Dubbo和Consul的实例,不过差别不太大。
三、准备数据库
创建数据库:tx-manager
数据库脚本:
CREATE TABLE `t_tx_exception` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`group_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`unit_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`mod_id` varchar(128) CHARACTER SET utf8m