欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

TX-LCN分布式事务Demo实战

程序员文章站 2022-08-23 15:37:37
1. TX LCN分布式事务Demo实战 1.1. 原理介绍 1.1.1. 事务控制原理 1. TX LCN由两大模块组成, TxClient、TxManager ,TxClient作为模块的依赖框架,提供TX LCN的标准支持,TxManager作为分布式事务的控制放。事务发起方或者参与反都由Tx ......

1. tx-lcn分布式事务demo实战

1.1. 原理介绍

1.1.1. 事务控制原理

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

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)
    @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版本

  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去跑通吧
    TX-LCN分布式事务Demo实战

1.5. 官方网站

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