分布式事务之TX-LCN
分布式事务TX-LCN
# 分布式事务之TX-LCN
# 什么是TX-LCN
TX-LCN定位于一款事务协调性框架,框架其本身并不操作事务,而是基于对事务的协调从而达到事务一致性的效果。
TX-LCN 主要有两个模块,Tx-Client(TC) Tx-Manager(TM). TC作为微服务下的依赖,TM是独立的服务。
# TX-LCN原理
- 核心步骤:
- 创建事务组: 是指在事务发起方开始执行业务代码之前先调用TxManager创建事务组对象,然后拿到事务标示GroupId的过程。
- 加入事务组: 添加事务组是指参与方在执行完业务方法以后,将该模块的事务信息通知给TxManager的操作。
- 通知事务组: 是指在发起方执行完业务代码以后,将发起方执行结果状态通知给TxManager,TxManager将根据事务最终状态和事务组的信息来通知相应的参与模块提交或回滚事务, 并返回结果给事务发起方。
# TX-LCN项目调用架构
由项目调用架构图可以看出来,TM
需要使用的Redis
,所以我们需要准备一台Redis
# TM环境搭建
1、创建一个SpringBoot
项目,lcn-tm
添加如下依赖,并且在启动类上添加注解@EnableTransactionManagerServer
<dependency>
<groupId>com.codingapi.txlcn</groupId>
<artifactId>txlcn-tm</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>com.codingapi.txlcn</groupId>
<artifactId>txlcn-tc</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>com.codingapi.txlcn</groupId>
<artifactId>txlcn-txmsg-netty</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2、创建数据库tx-manager
并且执行如下脚本,TM
需要 t_tx_exception
和t_logger
俩张表
CREATE TABLE `t_tx_exception` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`group_id` varchar(32) DEFAULT NULL,
`unit_id` varchar(32) DEFAULT NULL,
`mod_id` varchar(32) DEFAULT NULL,
`transaction_state` tinyint(4) DEFAULT NULL,
`registrar` tinyint(4) DEFAULT NULL COMMENT '-1 未知 0 Manager 通知事务失败, 1 client询问事务状态失败2 事务发起方关闭事务组失败',
`ex_state` tinyint(4) DEFAULT NULL COMMENT '0 待处理 1已处理',
`create_time` datetime DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 ROW_FORMAT=DYNAMIC
CREATE TABLE `t_logger` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`group_id` varchar(64) NOT NULL,
`unit_id` varchar(32) NOT NULL,
`tag` varchar(50) NOT NULL,
`content` varchar(1024) NOT NULL,
`create_time` varchar(30) NOT NULL,
`app_name` varchar(128) NOT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=latin1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
3、配置TM
服务,在项目lcn-tm
的配置文件application.properties
(注意目前只支持properties
文件格式)添加如下配置
server.port=7970
# TM事务管理器,需要访问数据库,实现分布式事务状态记录。
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/tx-manager?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root
# TM事务管理器,是依赖Redis使用分布式事务协调的。尤其是TCC和TXC两种事务模型。
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.database=0
# 为spring应用起名。
spring.application.name=tx-lcn-transaction-manager
# TM事务管理器,提供的WEB管理平台的登录密码。无用户名。 默认是codingapi
tx-lcn.manager.admin-key=triumphxx
# 日志。如果需要TM记录日志。则开启,赋值为true,并提供后续的配置。
mybatis.configuration.map-underscore-to-camel-case=true
mybatis.configuration.use-generated-keys=true
# 日志。如果需要TM记录日志。则开启,赋值为true,并提供后续的配置。
tx-lcn.logger.enabled=true
# TxManager Host Ip
tx-lcn.manager.host=127.0.0.1
# TxClient连接请求端口
tx-lcn.manager.port=8070
# 心跳检测时间(ms)
tx-lcn.manager.heart-time=15000
# 分布式事务执行总时间
tx-lcn.manager.dtx-time=300000
#参数延迟删除时间单位ms
tx-lcn.message.netty.attr-delay-time=10000
tx-lcn.manager.concurrent-level=128
# 开启日志
logging.level.com.codingapi=debug
#为日志功能,提供数据库连接,和前面的使用的不是一个数据源
tx-lcn.logger.driver-class-name=com.mysql.cj.jdbc.Driver
tx-lcn.logger.jdbc-url=jdbc:mysql://localhost:3306/tx-manager?characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
tx-lcn.logger.username=root
tx-lcn.logger.password=root
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
4、启动项目lcn-tm
访问http://localhost:7970/
出现如下画面,表示TM
服务搞定
5、输入配置文件中配置的密码tx-lcn.manager.admin-key=triumphxx
就能够登录
以上就是TX-LCN
的基本介绍和TM
的搭建
# TC环境搭建
由于我们是微服务,所以需要创建一个注册中心,我们就用Eureka
来搭建,项目为eureka-server
,这里就不赘述了,还需要创建俩个项目来模拟分布式事务的场景,
分别为lcn-order
订单服务和lcn-pay
支付服务。
1、在订单服务支付服务中添加如下依赖,并且在启动类上添加注解@EnableDistributedTransaction
表示开启分布式事务
<!--TC依赖 开始-->
<dependency>
<groupId>com.codingapi.txlcn</groupId>
<artifactId>txlcn-tc</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>com.codingapi.txlcn</groupId>
<artifactId>txlcn-txmsg-netty</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<!--TC依赖 结束-->
2
3
4
5
6
7
8
9
10
11
12
13
2.配置TC
,在yaml
文件中接入如下配置,表示连接的TM
信息
tx-lcn:
client:
manager-address: 127.0.0.1:8070
2
3
3、启动TC
,登录到TM
管理后台可以看到注册的TC
,以及点击详细信息可以看到TC
的详细信息
注册信息
详细信息
以上就是TX-LCN
TC
的搭建
# 总结
以上就是TX-LCN
的介绍以及环境的搭建,后面我们讨论TX-LCN
的几种模式。