TX-LCN分布式事务Demo实战

2024-05-02 10:38
文章标签 实战 分布式 事务 demo tx lcn

本文主要是介绍TX-LCN分布式事务Demo实战,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. TX-LCN分布式事务Demo实战

1.1. 原理介绍

1.1.1. 事务控制原理

  1. TX-LCN由两大模块组成, TxClient、TxManager,TxClient作为模块的依赖框架,提供TX-LCN的标准支持,TxManager作为分布式事务的控制放。事务发起方或者参与反都由TxClient端来控制。(简单来说就是单独部署一套TxManager模块来实现事务管理,TxClient就是我们自己的服务系统
  2. 原理图如下:
    1

1.1.2. LCN事务模式

1.1.2.1. 原理介绍
  1. LCN模式是通过代理Connection的方式实现对本地事务的操作,然后在由TxManager统一协调控制事务。当本地事务提交回滚或者关闭连接时将会执行假操作,该代理的连接将由LCN连接池管理。
1.1.2.2. 模式特点
  1. 该模式对代码的嵌入性为低
  2. 该模式仅限于本地存在连接对象且可通过连接对象控制事务的模块。
  3. 该模式下的事务提交与回滚是由本地事务方控制,对于数据一致性上有较高的保障
  4. 该模式缺陷在于代理的连接需要随事务发起方一共释放连接,增加了连接占用的时间

1.1.3. TCC事务模式

1.1.3.1. 原理介绍
  1. TCC事务机制相对于传统事务机制(X/Open XA Two-Phase-Commit),其特征在于它不依赖资源管理器(RM)对XA的支持,而是通过对(由业务系统提供的)业务逻辑的调度来实现分布式事务。主要由三步操作,Try: 尝试执行业务、 Confirm:确认执行业务、 Cancel: 取消执行业务
1.1.3.2. 模式特点
  1. 该模式对代码的嵌入性高,要求每个业务需要写三种步骤的操作。
  2. 该模式对有无本地事务控制都可以支持使用面广。
  3. 数据一致性控制几乎完全由开发者控制,对业务开发难度要求高

1.1.4. TXC事务模式

1.1.4.1. 原理介绍
  1. TXC模式命名来源于阿里云的GTS,实现原理是在执行SQL之前,先查询SQL的影响数据保存起来然后再执行业务。当需要回滚的时候就采用这些记录数据回滚事务
1.1.4.2. 模式特点
  1. 该模式同样对代码的嵌入性低
  2. 该模式仅限于对支持SQL方式的模块支持。
  3. 该模式由于每次执行SQL之前需要先查询影响数据,因此相比LCN模式消耗资源与时间要多
  4. 该模式不会占用数据库的连接资源

1.2. 快速开始

1.2.1. 吐槽

  1. 坑点一:不要相信官方网站上的的快速开始和示例,不知道是多久以前的了,我捣鼓了很久,下下来的代码缺斤少两的,打包了源代码也满足不了这示例代码的需求
  2. 坑点二:不要直接使用源代码的tx-manager,肯定仍旧缺少配置,或者和示例代码版本不一致
  3. 让我来个完整的能运行的示例Demo。 ps:也都是从官方github拉的
  4. 我演示的是4.0的demo,目前也够用了,5.0的demo我是运行不起来,缺少jar包,有路过的大神知道怎么搞,求教

1.2.2. tx-manager

https://pan.baidu.com/s/1cLKAeE#list/path=%2Fsharelink974324822-625872931897976%2Ftx-manager&parentPath=%2Fsharelink974324822-625872931897976

  1. 这个tx-manager直接从官方提供的网盘下载,我下的4.1版本的
  2. 修改配置文件,eureka和redis都整成自己的
  3. 直接java -jar tx-manager.jar 运行起来就可以了

1.2.3. SpringCloud Demo

https://github.com/codingapi/springcloud-lcn-demo

  1. 上述地址为4.0版本的demo,经试验可以使用
  2. 我用mybatis-demo这个包做的试验,里面两个module,分别修改application.properties,只需要修改数据库mysql和eureka地址就行
  3. 当然数据库别忘了建,建个test库,新建下列表用于测试
USE test;DROP TABLE IF EXISTS `t_test`;CREATE TABLE `t_test` (`id` int(11) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(50) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

1.3. 使用总结

  1. 如果需要在自己的项目使用LCN只需要两步
    1. 引入pom
    <lcn.last.version>4.1.0</lcn.last.version><dependency><groupId>com.codingapi</groupId><artifactId>transaction-springcloud</artifactId><version>${lcn.last.version}</version><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>*</artifactId></exclusion></exclusions>
    </dependency><dependency><groupId>com.codingapi</groupId><artifactId>tx-plugins-db</artifactId><version>${lcn.last.version}</version><exclusions><exclusion><groupId>org.slf4j</groupId><artifactId>*</artifactId></exclusion></exclusions>
    </dependency>
    1. 加一个注解,譬如
    @Override
    @TxTransaction(isStart = true)
    @Transactionalpublic int save() {int rs2 = demo2Client.save();int rs1 = testMapper.save("mybatis-hello-1");
    //        int rs22 = demo2Client.save();//        int v = 100/0;return rs1+rs2;
    }
    加上 @TxTransaction(isStart = true) 表示事务开始,在走完整个流程以前,事务都会由tx-manager来协调

1.4. 4.0与5.0版本

  1. 5.0刚出来没多久,也就1月份开始大量提交,并已经交由codingApi团队开发维护,对5.0的使用,或许还要经历些时间的磨练
  2. 对上述这个注解,在4.0我找到原代码是这样的
/*** Created by lorne on 2017/6/26.*/
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface TxTransaction {/*** 是否LCN事务发起方* @return true 是:是发起方 false 否:是参与方*/boolean isStart() default false;/*** 回滚异常* @return*/Class<? extends Throwable>[] rollbackFor() default {};/*** 不回滚异常* @return*/Class<? extends Throwable>[] noRollbackFor() default {};}
  1. 在5.0我同样找到了源代码,是这样的
/*** Created by lorne on 2017/6/26.*/
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Inherited
@Documented
public @interface TxTransaction {/*** 事务模式 transaction type** @return lcn, tcc, txc* @see Transactions*/String type() default Transactions.LCN;/*** 分布式事务传播行为** @return 传播行为* @see DTXPropagation*/DTXPropagation propagation() default DTXPropagation.REQUIRED;
}
  1. 很明显,注解使用和实现都完全变了,4.0和5.0明显不能兼容了。
  2. 通过新版本的一堆注解也可以看出来,4.0版本只支持LCN模式,想要尝试TCC和TXC的,把5.0的Demo去跑通吧
    751560-20190131153056910-494160822.png

1.5. 官方网站

https://www.txlcn.org/zh-cn/docs/start.html

这篇关于TX-LCN分布式事务Demo实战的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/954063

相关文章

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景

在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程

《在Java中使用ModelMapper简化Shapefile属性转JavaBean实战过程》本文介绍了在Java中使用ModelMapper库简化Shapefile属性转JavaBean的过程,对比... 目录前言一、原始的处理办法1、使用Set方法来转换2、使用构造方法转换二、基于ModelMapper

Java实战之自助进行多张图片合成拼接

《Java实战之自助进行多张图片合成拼接》在当今数字化时代,图像处理技术在各个领域都发挥着至关重要的作用,本文为大家详细介绍了如何使用Java实现多张图片合成拼接,需要的可以了解下... 目录前言一、图片合成需求描述二、图片合成设计与实现1、编程语言2、基础数据准备3、图片合成流程4、图片合成实现三、总结前

MYSQL事务死锁问题排查及解决方案

《MYSQL事务死锁问题排查及解决方案》:本文主要介绍Java服务报错日志的情况,并通过一系列排查和优化措施,最终发现并解决了服务假死的问题,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录问题现象推测 1 - 客户端无错误重试配置推测 2 - 客户端超时时间过短推测 3 - mysql 版本问

nginx-rtmp-module构建流媒体直播服务器实战指南

《nginx-rtmp-module构建流媒体直播服务器实战指南》本文主要介绍了nginx-rtmp-module构建流媒体直播服务器实战指南,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. RTMP协议介绍与应用RTMP协议的原理RTMP协议的应用RTMP与现代流媒体技术的关系2

C语言小项目实战之通讯录功能

《C语言小项目实战之通讯录功能》:本文主要介绍如何设计和实现一个简单的通讯录管理系统,包括联系人信息的存储、增加、删除、查找、修改和排序等功能,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录功能介绍:添加联系人模块显示联系人模块删除联系人模块查找联系人模块修改联系人模块排序联系人模块源代码如下

Golang操作DuckDB实战案例分享

《Golang操作DuckDB实战案例分享》DuckDB是一个嵌入式SQL数据库引擎,它与众所周知的SQLite非常相似,但它是为olap风格的工作负载设计的,DuckDB支持各种数据类型和SQL特性... 目录DuckDB的主要优点环境准备初始化表和数据查询单行或多行错误处理和事务完整代码最后总结Duck

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

java如何分布式锁实现和选型

《java如何分布式锁实现和选型》文章介绍了分布式锁的重要性以及在分布式系统中常见的问题和需求,它详细阐述了如何使用分布式锁来确保数据的一致性和系统的高可用性,文章还提供了基于数据库、Redis和Zo... 目录引言:分布式锁的重要性与分布式系统中的常见问题和需求分布式锁的重要性分布式系统中常见的问题和需求

Redis事务与数据持久化方式

《Redis事务与数据持久化方式》该文档主要介绍了Redis事务和持久化机制,事务通过将多个命令打包执行,而持久化则通过快照(RDB)和追加式文件(AOF)两种方式将内存数据保存到磁盘,以防止数据丢失... 目录一、Redis 事务1.1 事务本质1.2 数据库事务与redis事务1.2.1 数据库事务1.