分布式事务

简介: 解决方案介绍与实现

分布式事务为何存在

随着架构的演变,分布式、微服务变得流行起来,各个拆分的项目之间存在调用问题,每个服务对应的数据库也可能不一致,这时候可用性、数据安全性就存在隐患,也就是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

  1. 搭建好Redis和MySQL SQL建表语句(在txlcn-tm模块的resource目录下)
  2. 修改txlcn-tm的配置文件application.properties

(数据库的名称,和用户名密码,根据自己的实际情况修改)

  1. 启动txlcn-tm模块

启动后打开后台地址http://localhost:7970,初始密码是codingapi

  1. 项目配置
 <!-- 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 //本地事务注解
目录
相关文章
|
27天前
|
消息中间件 缓存 监控
避免分布式事务
避免分布式事务
|
2月前
|
数据库
分布式事务(一)
分布式事务(一)
|
2月前
|
消息中间件 数据库
分布式事务(二)
分布式事务(二)
|
2月前
|
数据库 微服务
分布式事务系列(三)
分布式事务系列(三)
|
2月前
|
消息中间件 关系型数据库 调度
分布式事务系列(二)
分布式事务系列(二)
|
2月前
|
数据库 微服务
分布式事务系列(一)
分布式事务系列(一)
|
3月前
|
消息中间件 数据库 RocketMQ
关于分布式事务的理解
关于分布式事务的理解
37 0
|
存储 算法 网络协议
一文了解分布式事务
一文了解分布式事务
|
消息中间件 SQL 存储
19、分布式事务
分布式事务
121 0
19、分布式事务