分布式事务为何存在
随着架构的演变,分布式、微服务变得流行起来,各个拆分的项目之间存在调用问题,每个服务对应的数据库也可能不一致,这时候可用性、数据安全性就存在隐患,也就是CAP问题,所以分布式事务就出来了。
本文基于TX-LCN实战
CAP原则又称CAP定理,指的是在一个分布式系统中, Consistency(一致性)、
Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼。
一致性(C):在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)
可用性(A):在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)
分区容忍性(P):以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。分布式事务的实现有许多种,其中 XA 分布式事务协议,XA 协议包含二阶段提交(2PC)和三阶段提交(3PC)两种实现
如何实现分布式事务
- 2PC
- 3PC
- TCC
- LCN
- TXC
- ................
2PC/3PC用来处理分布式事务:
能够很好的提供强一致性和强事务性,但相对来说延迟比较高,比较适合传统的单体应用,在同一个方法中存在跨库操作的情况,不适合高并发和高性能要求的场景。
TCC解决分布式事务原理
全称:Try、Confirm、Cancel
Try
对各个服务的资源做检测,对资源进行锁定或者预留
Confirm
在各个服务中执行实际的操作
Cancel
如果任何一个服务的业务方法执行出错,那么这里就需要进行补偿,即执行已操作成功的业务逻辑的回滚操作
举个转账栗子:
账户A
try:
try的幂等效验
try的悬挂处理
检查余额是否够30元
扣减30元
confirm:
空处理即可,通常TCC阶段是认为confirm是不会出错的
cancel:
cancel幂等效验
cacel空回滚处理
增加可用余额30元,回滚操作
账户B
try:
空处理即可
confirm:
confirm的幂等效验
正式增加30元
cancel:
空处理即可
TX-LCN解决方案实战
1.下载源码 源码下载地址:https://github.com/codingapi/tx-lcn
- 搭建好Redis和MySQL SQL建表语句(在txlcn-tm模块的resource目录下)
- 修改txlcn-tm的配置文件application.properties
(数据库的名称,和用户名密码,根据自己的实际情况修改)
- 启动txlcn-tm模块
启动后打开后台地址http://localhost:7970,初始密码是codingapi
- 项目配置
<!-- LCN -->
<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>
<dependency>
<groupId>com.codingapi.txlcn</groupId>
<artifactId>txlcn-tm</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
- 配置文件增加事务管理中心地址
# LCN
tx-lcn:
client:
manager-address: 127.0.0.1:8070
logger:
enabled: true
- Consumer、Provider1、Provider2启动类增加注解
@EnableDistributedTransaction // 启用分布式事务
- 在Priovider1、Provider2要执行的方法上增加注解
@LcnTransaction //分布式事务注解
@Transactional //本地事务注解