文章目录

  • 前言
  • 名词解释
  • TM 配置
  • TC 配置
    • LCN (Lock Confirm Notify) 模式
    • TCC (Try Confirm Cancel) 模式
  • 参考链接

前言

TX-LCN 是一款国产分布式事务协调框架,框架其本身并不操作事务,而是基于对事务的协调从而达到事务一致性的效果。

本文讲解如何使用 Springboot 作为基础,来配置使用 TX-LCN。

需要 MySQL 和 Redis。

名词解释

  • TM (Tx-Manager / Transaction Manager) 事务协调者
  • TC (Tx-Client / Transaction Client) 事务参与者 / 业务服务
  • 2PC (two phase commit) 两阶段提交

TM 配置

  • 初始化 TM Mysql 数据库,创建数据库名称为 tx-manager。执行以下 SQL 创建表
DROP TABLE IF EXISTS `t_tx_exception`;
CREATE TABLE `t_tx_exception`  (`id` bigint(20) NOT NULL AUTO_INCREMENT,`group_id` varchar(32) 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(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,`transaction_state` tinyint(4) NULL DEFAULT NULL,`registrar` tinyint(4) NULL DEFAULT NULL COMMENT '-1 未知 0 Manager 通知事务失败, 1 client询问事务状态失败2 事务发起方关闭事务组失败',`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 = 967 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;SET FOREIGN_KEY_CHECKS = 1;
  • 创建一个 Springboot 项目,pom.xml 添加依赖,指定相同版本号
<dependency><groupId>com.codingapi.txlcn</groupId><artifactId>txlcn-tm</artifactId><version>${txlcn.version}</version>
</dependency><dependency><groupId>com.codingapi.txlcn</groupId><artifactId>txlcn-tc</artifactId><version>${txlcn.version}</version>
</dependency><dependency><groupId>com.codingapi.txlcn</groupId><artifactId>txlcn-txmsg-netty</artifactId><version>${txlcn.version}</version>
</dependency>
  • 创建 Springboot 启动类,添加注解 @EnableTransactionManagerServer
import com.codingapi.txlcn.tm.config.EnableTransactionManagerServer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@EnableTransactionManagerServer
public class ManagerApplication {public static void main(String[] args) {SpringApplication.run(ManagerApplication.class, args);}
}
  • 添加配置文件 application.properties。配置 MySQL Redis 地址
spring.application.name=tx-manager
server.port=7970spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/tx-manager?characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=pwd888888mybatis.configuration.map-underscore-to-camel-case=true
mybatis.configuration.use-generated-keys=true# TM 与 TC 通信接口
#tx-lcn.manager.port=8070
#redis Ip
spring.redis.host=192.168.252.131
#redis 端口
spring.redis.port=6379
#redis 密码
spring.redis.password=
  • TM 配置到此完成,启动服务即可
  • TM 要实现高可用,多启动几台,连接相同的 MySQL Redis 即可。要注意它占用了两个(服务本身、与 TC 通信)端口。TC 配置文件中配置多个 TM 服务地址用逗号分隔

TC 配置

LCN (Lock Confirm Notify) 模式

  • LCN 是 2PC 的一种实现。通过代理 Connection 的方式实现对本地事务的操作,然后在由 TxManager 统一协调控制事务。当本地事务提交回滚或者关闭连接时将会执行假操作,该代理的连接将由 LCN 连接池管理。
  • 该模式对代码的嵌入性为低。仅限于本地存在连接对象且可通过连接对象控制事务的模块。该模式下的事务提交与回滚是由本地事务方控制,对于数据一致性上有较高的保障。该模式缺陷在于代理的连接需要随事务发起方一共释放连接,增加了连接占用的时间。
  • 其执行流程如下图示,图中事务发起方本身也是个参与者,是用户请求到达的第一个业务服务

  • pom.xml 添加依赖
<dependency><groupId>com.codingapi.txlcn</groupId><artifactId>txlcn-tc</artifactId><version>${txlcn.version}</version>
</dependency><dependency><groupId>com.codingapi.txlcn</groupId><artifactId>txlcn-txmsg-netty</artifactId><version>${txlcn.version}</version>
</dependency>
  • 创建 Springboot 启动类,添加注解 @EnableTransactionManagerServer
import com.codingapi.txlcn.tc.config.EnableDistributedTransaction;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;@EnableDistributedTransaction
@SpringBootApplication
public class TxLcnApplicationA {public static void main(String[] args) {SpringApplication.run(TxLcnApplicationA.class, args);}
}
  • 配置文件 中需要指定 TM 服务地址,多个用逗号分隔
tx-lcn:client:manager-address: localhost:8070
  • 在事务方法上加注解 @LcnTransaction
@LcnTransaction
@Transactional(rollbackFor = Exception.class)
public void addBusinessData(BusinessData businessData, boolean throwException) {save(businessData);String url = "http://txlcn-b/lcn/" + throwException;// 调用其他参与者事务restTemplate.postForEntity(url, businessData, String.class);
}

TCC (Try Confirm Cancel) 模式

  • TCC 通过对(由业务系统提供的)业务逻辑的调度来实现分布式事务。主要有三步操作:尝试执行业务(Try)、确认执行业务(Confirm)、取消执行业务(Cancel)。
  • 对有无本地事务控制都可以支持。
  • 对代码的嵌入性、业务开发难度较高,要求每个业务需要写三种步骤的操作,数据一致性控制几乎完全由开发者控制。
  • 其配置和 LCN 是一样的,只是处理业务方法时不一样。
  • 在业务方法上添加注解 @TccTransaction。
  • 写业务方法对应的 confirm 和 cancel 方法,默认情况这两个方法名字就是在业务方法名前加对应前缀。如果想自定义则需要在 @TccTransaction 注解中为这两个属性指定 confirmMethod cancelMethod。
@TccTransaction
@Transactional(rollbackFor = Exception.class)
public void addBusinessData(BusinessData businessData, boolean throwException) {save(businessData);// 调用其他参与者业务事务restTemplate.postForEntity("http://txlcn-b/tcc", businessData, String.class);
}/*** 确认事务** @param businessData -*/
public void confirmAddBusinessData(BusinessData businessData, boolean throwException) {log.info("confirmAddBusinessData 写入 MySQL 成功 : " + businessData);
}/*** 回滚事务** @param businessData -*/
public void cancelAddBusinessData(BusinessData businessData, boolean throwException) {removeById(businessData.getId());log.error("回滚 MySQL 成功 idempotenceKey = " + businessData.getIdempotenceKey());
}

参考链接

TX-LCN 中文文档

GitHub TX-LCN

GitHub 本文代码地址

Springboot整合TX-LCN实现分布式事务相关推荐

  1. SpringBoot+ Dubbo + Mybatis + Nacos +Seata整合来实现Dubbo分布式事务

    作者:请叫我东子 https://blog.csdn.net/u010046908/article/details/100536439 1.简介"本文主要介绍SpringBoot2.1.5 ...

  2. SpringBoot整合Mybatis,并实现事务控制

    SpringBoot整合Mybatis,并实现事务控制 1. 在pom文件里添加相关maven文件 <parent><groupId>org.springframework.b ...

  3. SpringBoot+Nacos+Seata实现Dubbo分布式事务管理

    SpringBoot+Nacos+Seata实现Dubbo分布式事务管理 https://www.shangmayuan.com/a/a3ba056126ba45db9b8dfd5b.html 源码下 ...

  4. SpringBoot+Zookeeper+Seata实现Dubbo分布式事务管理

    面我已经写过一篇SpringBoot+Nacos+Seata实现Dubbo分布式事务管理的文章,今天为什么还要写这篇呢,是因为好多公司还在用Zookeeper作为Dubbo的注册中心和配置中心在大规模 ...

  5. SpringBoot整合Dubbo+Zookeeper进行分布式搭建系统

    QUESTIONl:SpringBoot整合Dubbo+Zookeeper进行分布式搭建系统? ANSWER: 一:创建项目模块 1.1.创建一个Empty Project 名称:Dubbo 1.2. ...

  6. springboot整合redisson实现多种分布式锁

    Redisson概述 Redisson是一个在Redis的基础上实现的Java驻内存数据网格(In-Memory Data Grid).它不仅提供了一系列的分布式的Java常用对象,还提供了许多分布式 ...

  7. 3分钟搞定SpringBoot+Mybatis+druid多数据源和分布式事务

    在一些复杂的应用开发中,一个应用可能会涉及到连接多个数据源,所谓多数据源这里就定义为至少连接两个及以上的数据库了. 下面列举两种常用的场景: 一种是读写分离的数据源,例如一个读库和一个写库,读库负责各 ...

  8. 一文详解 SpringBoot 多数据源中的分布式事务

    作者 | 小涛 责编 | maozz 虽然现在微服务越来越流行,我们的系统随之也拆分出来好多的模块功能.这样做的目的其实就是为了弥补单体架构中存在的不足. 随着微服务的拆分,肯定设计到分库分表,但这之 ...

  9. SpringBoot+MyBatis(动态数据源/分布式事务XA(Atomikos))

    快速集成工具,欢迎打脸 说明 适用环境:SpringBoot / MyBatis / Atomickos  特性: 多数据源,动态切换 多数据源,XA分布式事务支持(需引入Atomickos) 仅支持 ...

  10. Springboot+nacos+seata实现简单分布式事务经验分享:二

    Springboot+nacos+seata实现简单的分布式事务 上一篇文章把三个服务都注册进nacos中了,这次就开始写业务代码 首先先创建三个数据库,每个数据库都需要有一张记录表,一张回滚表 or ...

最新文章

  1. 详解Java解析XML的四种方法
  2. jstl fn:replace替换换行符
  3. myeclipse同时部署两个项目-permgen space
  4. String类为什么是final
  5. 博士申请 | 宾州州立大学 (PSU) 招收机器学习/对抗学习方向全奖博士
  6. 极客班C++ STL(容器)第二周笔记
  7. [Kafka与Spark集成系列四] Spark运行结构
  8. NGUI EventDelagate事件委托
  9. c3p0数据库连接池不能取到连接
  10. 【缺陷检测】基于matlab形态学液晶显示器表面缺陷检测【含Matlab源码 1304期】
  11. 《BGP设计与实现》一2.11 总结
  12. 前端实战——实现购物车功能
  13. dicom worklist、pacs环境搭建
  14. latex自动生成中文目录_LaTeX技巧907:目录与格式定制
  15. 桃李春风一杯酒,江湖夜雨十年灯。
  16. Win10经常断开网络连接的原因
  17. LPC55S69开发笔记
  18. 1096:数字统计(C C++)
  19. Python-Opencv fitLine 拟合直线
  20. 你喜欢最华为手机哪一点?网友评论亮了

热门文章

  1. BurnAware – 轻量级免费刻录
  2. 粥,第一补人之物(转)
  3. /proc/vmstat输出含义
  4. jquery.slimscroll.js 插件库的应用
  5. 在银行存一年钱最多可以得到多少利息?
  6. Netty 入门教程
  7. java开源工作流引擎优势是什么?
  8. 一种基于RK3568+STM32+AD8684的电力可信物联人工智能网关设计方案
  9. 我的世界服务器无限装备指令2020,我的世界指令生成器
  10. 自动化软件测试流程的七个步骤包括哪些内容