思考集结处

vuePress-theme-reco 思考集结处    2024
思考集结处 思考集结处

Choose mode

  • dark
  • auto
  • light
首页
标签
分类
  • AI
  • Docker
  • 分布式事务
  • 文件存储
  • 框架
  • Spring
  • java
  • 其他
  • 搜索引擎
  • 源码
  • 网站
Java
网站
容器技术
搜索引擎
分布式事务
源码系列
框架系列
文件存储
AI
其他
GitHub
author-avatar

思考集结处

43

文章

18

标签

首页
标签
分类
  • AI
  • Docker
  • 分布式事务
  • 文件存储
  • 框架
  • Spring
  • java
  • 其他
  • 搜索引擎
  • 源码
  • 网站
Java
网站
容器技术
搜索引擎
分布式事务
源码系列
框架系列
文件存储
AI
其他
GitHub
  • 分布式事务
  • 分布式事务之TX-LCN
  • TX-LCN分布式事务之LCN模式
  • TX-LCN分布式事务之TCC模式

分布式事务之TX-LCN

vuePress-theme-reco 思考集结处    2024

分布式事务之TX-LCN

思考集结处 2021-10-12 分布式事务

分布式事务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>
1
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
1
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
1
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依赖 结束-->
1
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
1
2
3

3、启动TC,登录到TM管理后台可以看到注册的TC,以及点击详细信息可以看到TC的详细信息

  • 注册信息

  • 详细信息

以上就是TX-LCN TC的搭建

# 总结

以上就是TX-LCN的介绍以及环境的搭建,后面我们讨论TX-LCN的几种模式。

我是思考集结处欢迎你的关注
看板娘