Springcloud集成LCN实现分布式事务

1、概述

TX-LCN 主要有两个模块: Tx-Manager™,Tx-Client(TC) 。TM是管理端,独立的服务;TC就是我们自己的微服务。需要创建一个数据库和一张表。

drop database if exists `tx-manager`;
create database `tx-manager`; 
use `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 utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
  `transaction_state` tinyint(4) NULL DEFAULT NULL,
  `registrar` tinyint(4) NULL DEFAULT NULL,
  `remark` varchar(4096) NULL DEFAULT  NULL,
  `ex_state` tinyint(4) NULL DEFAULT NULL COMMENT '0 未解决 1已解决',
  `create_time` datetime(0) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic; 

2、创建Tx-Manager

这是一个单独的服务,可以集成在Springcloud中,也可以单独部署。但是,目前最新的maven包5.0.2启动要求比较严格,比如:必须要用application.properties,不能使用yml格式,还有其他要求,总之,不要轻易去更改配置内容,否则就是启动报错。以下以集成在Springcloud为例,新建一个module,项目结构也相对简单。
在这里插入图片描述
在这里插入图片描述
启动类另加一个注解@EnableTransactionManagerServer,如下在这里插入图片描述

pom.xml 中 添加一个依赖,

<dependency>
	<groupId>com.codingapi.txlcn</groupId>
	<artifactId>txlcn-tm</artifactId>
	<version>5.0.2.RELEASE</version>
</dependency>

引用父依赖,以实际的项目为准,参考其他module配置
在这里插入图片描述
如果是单独部署,则可以是

 <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.2.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

最重要的是application.properties文件

spring.application.name=t1-service
server.port=7970

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/tx-manager?serverTimezone=UTC&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=root
# 记录异常记录
spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
spring.jpa.hibernate.ddl-auto=update

mybatis.configuration.map-underscore-to-camel-case=true
mybatis.configuration.use-generated-keys=true

# TxManager Host Ip
tx-lcn.manager.host=127.0.0.1
# 后台管理页面登录密码
tx-lcn.manager.admin-key=123456
# TxClient连接请求端口
tx-lcn.manager.port=8070
# 心跳检测时间(ms)
tx-lcn.manager.heart-time=15000
# 分布式事务执行总时间
tx-lcn.manager.dtx-time=30000
#参数延迟删除时间单位ms
tx-lcn.message.netty.attr-delay-time=10000
tx-lcn.manager.concurrent-level=128
# 开启日志
tx-lcn.logger.enabled=true
logging.level.com.codingapi=debug
#redis 主机
spring.redis.host=XXXXXXXX
#redis 端口
spring.redis.port=6379
#redis 密码
spring.redis.password=XXXXXXXX

注意,redis的配置按实际地址配置,也需要预先启动。文件格式不要改成yml格式,否则会启动不了,以上就能单独启动TM服务了,不用再更改其他内容。

3、添加TC配置

这个相对简单些,有几个微服务涉及到事务控制,都要分别配置
在每个微服务的pom.xml添加2个依赖

<!--lcn事务-->
<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、在启动类上添加注解@EnableDistributedTransaction
2、在controller层添加注解@LcnTransaction,@Transactional
3、添加配置信息,manager-address地址和以上TM中的配置一致,logger可以删除,联调环境最好开启。

# 默认之配置为TM的本机默认端口
tx-lcn:
  client:
    manager-address: 127.0.0.1:8070
# 开启日志,默认为false
  logger:
    enabled: true
    driver-class-name: com.mysql.jdbc.Driver
    jdbc-url: jdbc:mysql://127.0.0.1:3306/tx-manager?serverTimezone=UTC&characterEncoding=UTF-8
    username: root
    password: root
    level.com.codingapi.txlcn: DEBUG

到此为止,配置就好了。

演示

后台管理页面登录地址:http://127.0.0.1:7970,密码:123456,TM配置中有写,我这边配置了2个微服务,就显示2个注册的TC。
在这里插入图片描述
演示代码如下:
在这里插入图片描述
以上调用服务之后,2个库都没插入新数据(回滚了),演示成功。
在这里插入图片描述

有人提出疑问了,这个异常记录是用来干嘛的,或者说新建的数据库中表没记录数据,感觉也没什么用。原因是因为它是用来记录“异常数据”。演示步骤如下:
1、更改代码
2、设置断点
3、执行到断点,断开另一个服务
4、放开断点,执行完代码(就会产生一条记录)
大致过程:通知另一个服务执行事务时,服务挂了,事务没有得到执行,就会成一条异常记录。
在这里插入图片描述
在这里插入图片描述
由此可见,这种用异常日志来记录事务的异常执行情况。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

屁仙

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值