TX-LCN分布式事务

一、介绍

  • LCN分布式事务框架的核心功能是对本地事务的协调控制,框架本身并不创建事务,只是对本地事务做协调控制
  • 因此该框架与其他第三方的框架兼容性强,支持所有的关系型数据库事务,支持多数据源,支持与第三方数据库框架一块使用
  • 在使用框架的时候只需要添加分布式事务的注解即可,对业务的侵入性低

二、实现原理

  • 创建事务组,是指在事务发起方开始执行业务代码之前先调用TxManager创建事务组对象,然后拿到事务标示GroupId的过程
  • 添加事务组,添加事务组是指参与方在执行完业务方法以后,将该模块的事务信息添加通知给TxManager的操作
  • 关闭事务组,是指在发起方执行完业务代码以后,将发起方执行结果状态通知给TxManager的动作。当执行完关闭事务组的方法以后,TxManager将根据事务组信息来通知相应的参与模块提交或回滚事务

原理图如下:

 

三、事务模式

1、LCN模式

LCN模式是通过代理Connection的方式实现对本地事务的操作,然后在由TxManager统一协调控制事务。当本地事务提交回滚或者关闭连接时将会执行假操作,该代理的连接将由LCN连接池管理。

2、TCC模式

TCC事务机制相对于传统事务机制(X/Open XA Two-Phase-Commit),其特征在于它不依赖资源管理器(RM)对XA的支持,而是通过对(由业务系统提供的)业务逻辑的调度来实现分布式事务。主要由三步操作,Try: 尝试执行业务、 Confirm:确认执行业务、 Cancel: 取消执行业务。

3、TXC模式

  TXC模式命名来源于淘宝,实现原理是在执行SQL之前,先查询SQL的影响数据,然后保存执行的SQL快走信息和创建锁。当需要回滚的时候就采用这些记录数据回滚数据库,目前锁实现依赖redis分布式锁控制。

 

四、使用

例子地址:https://github.com/codingapi/txlcn-demo

consul注册中心官网:https://www.consul.io/downloads.html

(1)启动TM,然后在进行测试。

启动准备

1、创建数据库tx-manager

2、创建数据表

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, `remark` varchar(4096) NULL DEFAULT NULL, `ex_state` tinyint(4) NULL DEFAULT NULL COMMENT '0 未解决 1已解决', `create_time` datetime(0) NULL DEFAULT NULL, PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

3、覆盖默认redis连接地址为自己地址

访问 http://127.0.0.1:7970/admin/index.html进入TM管理后台,默认密码时codingapi。

可以通过TM配置文件自定义密码。

 

(2)启动TC(a,b,c服务)

启动准备

1、创建数据库txlcn-demo

2、创建数据表

create table `t_demo` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `kid` varchar(45) DEFAULT NULL, `group_id` varchar(64) DEFAULT NULL, `demo_field` varchar(255) DEFAULT NULL, `app_name` varchar(128) DEFAULT NULL, `create_time` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

 

 

注意:Demo默认的注册中心是consul,本地测试需要启动consul,也可以修改别的注册中心,如eurka,nacos等。

Tx-Manager(TM)服务的配置文件有默认的redis连接,需要使用自己的redis连接覆盖掉默认连接。

你可能感兴趣的:(java开发)