实验用的示例代码: https://github.com/NightmareZero/TX-LCN-EXAMPLE 官方网站: https://www.txlcn.org Github: https://github.com/codingapi/tx-lcn
TX-LCN分布式事务框架 主要分为两部分,Client
及Server
。
分为三种模式
- LCN模式 通过代理Connection的方式实现对本地事务的操作,然后在由TxManager统一协调控制事务。当本地事务提交回滚或者关闭连接时将会执行假操作,该代理的连接将由LCN连接池管理。
- TXC模式 实现原理是在执行SQL之前,先查询SQL的影响数据,然后保存执行的SQL快走信息和创建锁。当需要回滚的时候就采用这些记录数据回滚数据库,目前锁实现依赖redis分布式锁控制。
- TCC模式 相对于传统事务机制(X/Open XA Two-Phase-Commit),其特征在于它不依赖资源管理器(RM)对XA的支持,而是通过对(由业务系统提供的)业务逻辑的调度来实现分布式事务。主要由三步操作,Try: 尝试执行业务、 Confirm:确认执行业务、 Cancel: 取消执行业务。
本示例基于SpringCloud和TCC模式
服务端需要jdbc和redis
需要添加的Pom依赖:
create database if not exists `tx-manager` default charset utf8 collate utf8_general_ci;
<dependency>
<groupId>com.codingapi.txlcn</groupId>
<artifactId>txlcn-tm</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<!-- 此处使用Mysql,可以使用任意JDBC库 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>6.0.6</version>
</dependency>
项目注解:
@SpringBootApplication
@EnableTransactionManagerServer
public class TmServApplication { ...... }
application.properties主要配置:
spring.application.name=TransactionManager
server.port=7970
#tx-lcn.logger.enabled=true
# TxManager Host Ip
#tx-lcn.manager.host=127.0.0.1
# TxClient连接请求端口
#tx-lcn.manager.port=8070
# 心跳检测时间(ms)
#tx-lcn.manager.heart-time=15000
# 分布式事务执行总时间
#tx-lcn.manager.dtx-time=30000
#参数延迟删除时间单位ms
#tx-lcn.message.netty.attr-delay-time=10000
#tx-lcn.manager.concurrent-level=128
# 开启日志
#tx-lcn.logger.enabled=true
#logging.level.com.codingapi=debug
# jdbc 的设置信息, 线上请用Cluster
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/tx-manager?characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=root
# redis 的设置信息. 线上请用Redis Cluster
spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.password=
待续
项目注解:
@SpringBootApplication
@EnableDistributedTransaction // 客户端需要添加的注释
public class TestTmServ1Application {}
依赖包:
<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>
配置文件:application.properties
tx-lcn.client.manager-address=127.0.0.1:8070
事物发起端:
特殊配置:@TccTransaction(propagation = DTXPropagation.REQUIRED)
@Service
public class Test2Service {
public Logger logger = LoggerFactory.getLogger(this.getClass().getName());
@Autowired
public Test2Service(RemoteApi remoteApi) {
this.remoteApi = remoteApi;
}
private RemoteApi remoteApi;
/**
* try方法,用于尝试执行或者准备工作
* propagation - 事物的模式
* confirmMethod - 成功时执行的方法
* cancelMethod - 回滚时执行的方法
*/
@TccTransaction(propagation = DTXPropagation.REQUIRED, confirmMethod = "doWorkConfirm", cancelMethod = "doWorkCancel")
@Transactional
public boolean doTry(String val) {
logger.info("doWork");
String s = remoteApi.postInfo();
if (true) {
throw new RuntimeException("");
}
logger.info("finishwork");
return false;
}
/**
* 事物成功时执行的逻辑
* 入参:需要保持与对应的Try方法一致
*/
public void doWorkConfirm(String val) {
logger.info("------serv1--confirm--" + val);
}
/**
* 事物失败时执行的逻辑
* 入参:需要保持与对应的Try方法一致
*/
public void doWorkCancel(String val) {
logger.info("------serv1--cancel--" + val);
}
}
事物接收端:
特殊配置:@TccTransaction(propagation = DTXPropagation.SUPPORTS)
@Service
public class Test2Service {
public Logger logger = LoggerFactory.getLogger(this.getClass().getName());
@TccTransaction(propagation = DTXPropagation.SUPPORTS, confirmMethod = "doWorkConfirm", cancelMethod = "doWorkCancel")
@Transactional
public boolean doTry(String val) {
logger.info("<======serv2--doWork======>");
// throw new RuntimeException("");
logger.info("<======serv2--finishwork======>");
return false;
}
public void doWorkConfirm(String val) {
logger.info("<======serv2--confirm======>" + val);
}
public void doWorkCancel(String val) {
logger.info("<======serv2--cancel======>" + val);
}
}
名词解释:
- 发起端: 分布式事物的发起的服务
- 参与端: 被发起点在事物中远程调用的服务
- try方法: 用于准备或尝试执行的方法,也可以放置业务逻辑
- confirm方法: 用于事物成功收尾的方法,不会与cancel方法同时发生
- cancel方法: 用于事物回滚的方法,不会与confirm同时发生
特点:
- try方法成功return时,则视为本地事务执行成功,否则视为本地事物执行失败
- 在参与端try方法异常退出时,本地事物回滚,但不影响总体事物
- 在发起端try方法异常退出时,所有执行成功的事物执行cancel方法
- 在发起端try方法正常结束时,所有未执行cancel的事物执行confirm方法
- 请保证在confirm和cancel方法中,不要出现异常退出的情况,可能会导致事务性出现问题