分布式事务解决方案介绍与实现

分布式事务为何存在

随着架构的演变,分布式、微服务变得流行起来,各个拆分的项目之间存在调用问题,每个服务对应的数据库也可能不一致,这时候可用性、数据安全性就存在隐患,也就是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 2. 搭建好Redis和MySQL SQL建表语句(在txlcn-tm模块的resource目录下) 3. 修改txlcn-tm的配置文件application.properties (数据库的名称,和用户名密码,根据自己的实际情况修改) 4. 启动txlcn-tm模块 启动后打开后台地址http://localhost:7970,初始密码是codingapi 5. 项目配置

<!-- 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>
  1. 配置文件增加事务管理中心地址
# LCN
tx-lcn:
    client:
        manager-address: 127.0.0.1:8070
    logger:
        enabled: true
  1. Consumer、Provider1、Provider2启动类增加注解
@EnableDistributedTransaction  // 启用分布式事务
  1. 在Priovider1、Provider2要执行的方法上增加注解
@LcnTransaction //分布式事务注解
@Transactional //本地事务注解
经验分享 程序员 微信小程序 职场和发展