zoukankan      html  css  js  c++  java
  • 分布式事务框架 TX-LCN 使用

    TX-LCN 是一个分布式 事务框架, 很好用,原理简单实用简单,但是已经停止更新一年多了。

      支持多种 分布式事务的方案,这次直说最核心的LCN 方式。

    名词解释

      TM:  事务管理中心

      TC:就是我们的服务

    原理:TC-A 发起一个 基于本地事务的分布式事务, 这时候产生一个随机Id 标志这个 TC-A 调用 TC-B 的时候,通过请求头,X-Group-ID 吧这个参数带过去。

        TC-B 查询到 单前事务有这个 X-Group-ID , 和  告诉TM 事务B 加入 这个  X-Group-ID 标记的 事务组 ,那么 做完本地事务以后不会立即提交,而是告诉 TM  事务B 已经可以提交了,知道 所有的事务都 到达 可以提交的 地步,TM通知所有 事务一起提交。 如果 有 后面的 事务 失败,那么 TM 会通知 前面的事务 回滚,发起分布式事务的那个 事务 A 需要依赖 api 调用异常 回滚( 如果吞了这个异常 , 发起分布式 事务的 本地事务 不会回滚  )。

    使用:

    1 下载 TM 的代码,修改配置,需要 mysql 和 redis ,mysql需要 初始化数据库和 表。然后编译启动 TM

      

    修改配置:

    spring.application.name=TransactionManager
    server.port=7970
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
    spring.datasource.url=jdbc:mysql://118.24.0.161:6033/tx-manager?characterEncoding=UTF-8
    spring.datasource.username=****
    spring.datasource.password=****
    spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect
    spring.jpa.hibernate.ddl-auto=update
    
    
    #redis 主机
    spring.redis.host=118.24.0.161
    #redis 端口
    spring.redis.port=9736
    #redis 密码
    spring.redis.password=***
    

      

    初始化sql

    CREATE DATABASE IF NOT EXISTS  `tx-manager` DEFAULT CHARSET utf8 COLLATE utf8_general_ci;
    USE `tx-manager`;
    
    SET NAMES utf8mb4;
    SET FOREIGN_KEY_CHECKS = 0;
    
    -- ----------------------------
    -- Table structure for t_tx_exception
    -- ----------------------------
    DROP TABLE IF EXISTS `t_tx_exception`;
    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,
      `ex_state` tinyint(4) NULL DEFAULT NULL COMMENT '0 待处理 1已处理',
      `remark` varchar(10240) NULL DEFAULT NULL COMMENT '备注',
      `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;
    

      

    2 修改每一个 TC 

      1 引入 maven 依赖

          

     <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>
    

     

     2 在启动类上开启分布式事务  : @EnableDistributedTransaction

        

      3 在 TC 配置文件中指定 TM 的 地址

        

        

         

      如果有TM 有高可用: 指定多个

        

      4 在 本地事务方法前面 和 远程 服务事务方法前面加上  开始分布式事务注解 @LcnTransaction 

        

      

        

    备注:如果使用统一异常处理,对前端放回指定的 格式,这样 发起 分布式事务的 那个本地事务无法感知 远程事务回滚( 理论上可以感知,LNC 这个框架没处理 ),所以如果是这种结构应该 在检查到是统一异常处理的时候,抛出一个 可以让事务回滚的异常。

    TX-LCN 也支持  TCC 事务。

    使用 @TccTransaction  代替 @LcnTransaction

    TCC事务 ,需要指定  cc 的 两个方法。 @TccTransaction(cancelMethod = "c1",confirmMethod = "c2")

    TCC 模式下 confirmMethod  异常,会有记录,并且火根据 日志重试,但是,按照官方配置了 日志 依旧不生效

    抛出:

    com.codingapi.txlcn.common.exception.TxClientException: non exists aspect log. 暂时不知道怎么解决。 

    TXC 类型的事务。 没太升入的了解

  • 相关阅读:
    使用c#生成Identicon图片
    C#实现对文件目录的实时监控
    .Net Core的一些个人总结
    天天写业务代码,如何成为「技术大牛」?
    两款工作流JBPM和CCBPM的对比
    MVC5+EasyUI+EF6+Linq通用权限系统出炉--登录(2)
    MVC5+EasyUI+EF6+Linq通用权限系统出炉(1)
    博客园,久违了
    VS2010 代码行数统计以及代码复制汉字出现乱码
    关于TerrainExplorer的一些资源网址设置方法(备忘)
  • 原文地址:https://www.cnblogs.com/cxygg/p/12410294.html
Copyright © 2011-2022 走看看