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 类型的事务。 没太升入的了解

  • 相关阅读:
    jquery 实现 html5 placeholder 兼容password密码框
    php返回json的结果
    使用PHP读取远程文件
    Sharepoint 自定义字段
    Sharepoint 中新增 aspx页面,并在页面中新增web part
    【转】Sharepoint 2010 配置我的站点及BLOG
    JS 实现 Div 向上浮动
    UserProfile同步配置
    【转】Import User Profile Photos from Active Directory into SharePoint 2010
    Sharepoint 2010 SP1升级后 FIMSynchronizationService 服务无法开启
  • 原文地址:https://www.cnblogs.com/cxygg/p/12410294.html
Copyright © 2011-2022 走看看