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

 
1.1.2. LCN事务模式
1.1.2.1. 原理介绍
- LCN模式是通过代理Connection的方式实现对本地事务的操作,然后在由TxManager统一协调控制事务。当本地事务提交回滚或者关闭连接时将会执行假操作,该代理的连接将由LCN连接池管理。
 
1.1.2.2. 模式特点
- 该模式对代码的嵌入性为低。
 - 该模式仅限于本地存在连接对象且可通过连接对象控制事务的模块。
 - 该模式下的事务提交与回滚是由本地事务方控制,对于数据一致性上有较高的保障。
 - 该模式缺陷在于代理的连接需要随事务发起方一共释放连接,增加了连接占用的时间
 
1.1.3. TCC事务模式
1.1.3.1. 原理介绍
- TCC事务机制相对于传统事务机制(X/Open XA Two-Phase-Commit),其特征在于它不依赖资源管理器(RM)对XA的支持,而是通过对(由业务系统提供的)业务逻辑的调度来实现分布式事务。主要由三步操作,Try: 尝试执行业务、 Confirm:确认执行业务、 Cancel: 取消执行业务。
 
1.1.3.2. 模式特点
- 该模式对代码的嵌入性高,要求每个业务需要写三种步骤的操作。
 - 该模式对有无本地事务控制都可以支持使用面广。
 - 数据一致性控制几乎完全由开发者控制,对业务开发难度要求高。
 
1.1.4. TXC事务模式
1.1.4.1. 原理介绍
- TXC模式命名来源于阿里云的GTS,实现原理是在执行SQL之前,先查询SQL的影响数据保存起来然后再执行业务。当需要回滚的时候就采用这些记录数据回滚事务。
 
1.1.4.2. 模式特点
- 该模式同样对代码的嵌入性低。
 - 该模式仅限于对支持SQL方式的模块支持。
 - 该模式由于每次执行SQL之前需要先查询影响数据,因此相比LCN模式消耗资源与时间要多。
 - 该模式不会占用数据库的连接资源。
 
1.2. 快速开始
1.2.1. 吐槽
- 坑点一:不要相信官方网站上的的快速开始和示例,不知道是多久以前的了,我捣鼓了很久,下下来的代码缺斤少两的,打包了源代码也满足不了这示例代码的需求
 - 坑点二:不要直接使用源代码的tx-manager,肯定仍旧缺少配置,或者和示例代码版本不一致
 - 让我来个完整的能运行的示例Demo。 ps:也都是从官方github拉的
 - 我演示的是4.0的demo,目前也够用了,5.0的demo我是运行不起来,缺少jar包,有路过的大神知道怎么搞,求教
 
1.2.2. tx-manager
- 这个tx-manager直接从官方提供的网盘下载,我下的4.1版本的
 - 修改配置文件,eureka和redis都整成自己的
 - 直接java -jar tx-manager.jar 运行起来就可以了
 
1.2.3. SpringCloud Demo
- 上述地址为4.0版本的demo,经试验可以使用
 - 我用mybatis-demo这个包做的试验,里面两个module,分别修改application.properties,只需要修改数据库mysql和eureka地址就行
 - 当然数据库别忘了建,建个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. 使用总结
如果需要在自己的项目使用LCN只需要两步
- 引入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>
- 加一个注解,譬如
 
@Override
@TxTransaction(isStart = true)
@Transactional
public 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版本
- 5.0刚出来没多久,也就1月份开始大量提交,并已经交由codingApi团队开发维护,对5.0的使用,或许还要经历些时间的磨练
 - 对上述这个注解,在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 {};
}
- 在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;
}
- 很明显,注解使用和实现都完全变了,4.0和5.0明显不能兼容了。
 - 通过新版本的一堆注解也可以看出来,4.0版本只支持LCN模式,想要尝试TCC和TXC的,把5.0的Demo去跑通吧

 
1.5. 官方网站
TX-LCN分布式事务Demo实战的更多相关文章
- LCN分布式事务管理(一)
		
前言 好久没写东西了,9月份换了份工作,一上来就忙的要死.根本没时间学东西,好在新公司的新项目里面遇到了之前没遇到过的难题.那遇到难题就要想办法解决咯,一个请求,调用两个服务,同时操作更新两个数据库. ...
 - 分布式事务(3)---强一致性分布式事务Atomikos实战
		
分布式事务(1)-理论基础 分布式事务(2)---强一致性分布式事务解决方案 分布式事务(4)---最终一致性方案之TCC 前面介绍强一致性分布式解决方案,这里用Atomikos框架写一个实战的dem ...
 - lcn 分布式事务协调者集群原理
		
lcn集群原理图: 1.实现原理: 1.1 LCN获取tm协调者注册地址 1. LCN客户端项目启动的时候,首先会注册到事务协调者中去,然后读取配置文件tm事务协调者的注册地址. 2. 向该事务协调者 ...
 - 关于LCN分布式事务框架
		
基于LCN框架解决分布式事务 LCN官网 https://www.txlcn.org/ "LCN并不生产事务,LCN只是本地事务的搬运工" 兼容 dubbo.springcloud ...
 - LCN解决分布式事务原理解析+项目实战(原创精华版)
		
写在前面: 原创不易,如果觉得不错推荐一下,谢谢! 由于工作需要,公司的微服务项目需解决分布式事务的问题,且由我进行分布式事务框架搭建和整合工作. 那么借此机会好好的将解决分布式事务的内容进行整理一下 ...
 - 基于Dubbo的分布式事务框架(LCN)
		
原文地址:http://原文地址:https://github.com/1991wangliang/transaction 基于Dubbo的分布式事务框架(LCN) 该框架依赖Redis/dubbo/ ...
 - TX-LCN 分布式事务框架
		
第十章 TX-LCN 分布式事务框架 (Spring Cloud 高级) 一. 什么是分布式事务 分布式事务是指事务的参与者.支持事务的服务器.资源服务器以及事务管理器分别位 于不同的分布式系统的不同 ...
 - Spring Cloud 分布式事务管理
		
Spring Cloud 分布式事务管理 在微服务如火如荼的情况下,越来越多的项目开始尝试改造成微服务架构,微服务即带来了项目开发的方便性,又提高了运维难度以及网络不可靠的概率. Spring Clo ...
 - 分布式事务(4)---最终一致性方案之TCC
		
分布式事务(1)-理论基础 分布式事务(2)---强一致性分布式事务解决方案 分布式事务(3)---强一致性分布式事务Atomikos实战 强一致性分布式事务解决方案要求参与事务的各个节点的数据时刻保 ...
 
随机推荐
- 9.Redis高可用-哨兵
			
9.Redis高可用-哨兵9.1 基本概念9.1.1 主从复制的问题9.1.2 高可用9.1.3 Redis Sentinel的高可用性9.2 安装和部署9.2.1 部署拓扑结构9.2.2 部署Red ...
 - 使用jconsole分析内存情况-JVM
			
JVM调优分析演练: Jconsole中对内存为如下结构: 原始代码: public static void main(String[] args) { BigInteger [] pArr=new ...
 - MySQL实现阶段累加的sql写法 ,eq:统计余额
			
最近项目碰到一个新的需求,统计每日充值/消费之后的余额.对于这种需求,其实也很简单,只需要在每次充值/消费后,计算下余额,然后保存下来就可以了.但是对于这种需求,一条sql就能搞定,都不需要做冗余字段 ...
 - AnjularJS 学习
			
一个不错的学习AnjularJS的网站,可以在线实践:http://www.runoob.com/angularjs/angularjs-tutorial.html
 - EasyPR源码剖析(6):车牌判断之LBP特征
			
一.LBP特征 LBP指局部二值模式,英文全称:Local Binary Pattern,是一种用来描述图像局部特征的算子,LBP特征具有灰度不变性和旋转不变性等显著优点. 原始的LBP算子定义在像素 ...
 - GUI学习之五——QAbstractButton类学习笔记
			
今天总结一下AbstractButton类的学习笔记. 一.描述 AbstractButton是对各种按键的抽象类他的继承关系是这样的 首先,QAbstractButton继承了QWidget类的各种 ...
 - 将IP转换为16进制,用于IPv4-IPv6
			
# --*-- coding: utf-8 --*--# create by xiaocaiji while 1: str_ip = input("input a IP:") li ...
 - this()基础用法
			
this()表示调用构造方法,此种调用只能用在构造方法中,即构造方法中调用构造方法this(实参). 1.this().this(实参)必须方法构造方法的第一行 2.在有参数构造方法中调用无参数构造方 ...
 - python3 第二十六章 - 内置函数之Number相关
			
数学函数 函数 返回值 ( 描述 ) 实例 abs(x) 返回数字的绝对值,如abs(-10) 返回 10 print(abs(-10)) =======输出:====== 10 ceil(x) 返回 ...
 - 使用WinMerge作为git的Merge工具
			
使用WinMerge作为git的Merge工具 我比较喜欢使用免费的WinMerge作为diff和merge工具,虽然TortoiseGit也自己带了TortoiseGitMerge工具,但是使用起来 ...