分布式事務框架 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 類型的事務。 沒太升入的了解

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM