分布式事务

0.理论基础

0.1.CAP定理

  • Consistency(一致性)
  • Availability(可用性)
  • Partition tolerance (分区容错性)
0.1.1.矛盾

在分布式系统中,系统间的网络不能100%保证健康,一定会有故障的时候,而服务有必须对外保证服务。因此Partition Tolerance不可避免。

当节点接收到新的数据变更时,就会出现问题了:

分布式事务

如果此时要保证 一致性,就必须等待网络恢复,完成数据同步后,整个集群才对外提供服务,服务处于阻塞状态,不可用。

如果此时要保证 可用性,就不能等待网络恢复,那node01、node02与node03之间就会出现数据不一致。

也就是说,在P一定会出现的情况下,A和C之间只能实现一个。

0.2.BASE理论

BASE理论是对CAP的一种解决思路,包含三个思想:

  • Basically Available (基本可用):分布式系统在出现故障时,允许损失部分可用性,即保证核心可用。
  • Soft State(软状态):在一定时间内,允许出现中间状态,比如临时的不一致状态。
  • Eventually Consistent(最终一致性):虽然无法保证强一致性,但是在软状态结束后,最终达到数据一致。

0.3.解决分布式事务的思路

分布式事务最大的问题是各个子事务的一致性问题,因此可以借鉴CAP定理和BASE理论,有两种解决思路:

  • AP模式:各子事务分别执行和提交,允许出现结果不一致,然后采用弥补措施恢复数据即可,实现最终一致。
  • CP模式:各个子事务执行后互相等待,同时提交,同时回滚,达成强一致。但事务等待过程中,处于弱可用状态。

但不管是哪一种模式,都需要在子系统事务之间互相通讯,协调事务状态,也就是需要一个 事务协调者(TC)

1.初识Seata

Seata是 2019 年 1 月份蚂蚁金服和阿里巴巴共同开源的分布式事务解决方案。致力于提供高性能和简单易用的分布式事务服务,为用户打造一站式的分布式解决方案。

官网地址:http://seata.io/,其中的文档、播客中提供了大量的使用说明、源码分析。

1.1.Seata的架构

Seata事务管理中有三个重要的角色:

  • TC (Transaction Coordinator) – 事务协调者:维护全局和分支事务的状态,协调全局事务提交或回滚。
  • TM (Transaction Manager) – 事务管理器:定义全局事务的范围、开始全局事务、提交或回滚全局事务。
  • RM (Resource Manager) – 资源管理器:管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。

整体的架构如图:

分布式事务

Seata基于上述架构提供了四种不同的分布式事务解决方案:

  • XA模式:强一致性分阶段事务模式,牺牲了一定的可用性,无业务侵入
  • TCC模式:最终一致的分阶段事务模式,有业务侵入
  • AT模式:最终一致的分阶段事务模式,无业务侵入,也是Seata的默认模式
  • SAGA模式:长事务模式,有业务侵入

无论哪种方案,都离不开TC,也就是事务的协调者。

1.2.部署TC服务

1.2.1.引入依赖

    com.alibaba.cloud
    spring-cloud-starter-alibaba-seata

            seata-spring-boot-starter
            io.seata

    io.seata
    seata-spring-boot-starter

    ${seata.version}

1.2.2.配置TC地址
seata:
  registry: # TC服务注册中心的配置,微服务根据这些信息去注册中心获取tc服务地址
    type: nacos # 注册中心类型 nacos
    nacos:
      server-addr: 127.0.0.1:8848 # nacos地址
      namespace: "" # namespace,默认为空
      group: DEFAULT_GROUP # 分组,默认是DEFAULT_GROUP
      application: seata-tc-server # seata服务名称
      username: nacos
      password: nacos
  tx-service-group: seata-demo # 事务组名称
  service:
    vgroup-mapping: # 事务组与cluster的映射关系
      seata-demo: SH

2.Seata中的四种不同的事务模式

2.1.XA模式

XA 规范 是 X/Open 组织定义的分布式事务处理(DTP,Distributed Transaction Processing)标准,XA 规范 描述了全局的TM与局部的RM之间的接口,几乎所有主流的数据库都对 XA 规范 提供了支持。

2.1.1.Seata的XA模型

Seata对原始的XA模式做了简单的封装和改造,以适应自己的事务模型,基本架构如图:

分布式事务

RM一阶段的工作:

① 注册分支事务到TC

② 执行分支业务sql但不提交

③ 报告执行状态到TC

TC二阶段的工作:

  • TC检测各分支事务执行状态
    a.如果都成功,通知所有RM提交事务
    b.如果有失败,通知所有RM回滚事务

RM二阶段的工作:

  • 接收TC指令,提交或回滚事务

2.1.2.优缺点

XA模式的优点是什么?

  • 事务的强一致性,满足ACID原则。
  • 常用数据库都支持,实现简单,并且没有代码侵入

XA模式的缺点是什么?

  • 因为一阶段需要锁定数据库资源,等待二阶段结束才释放,性能较差
  • 依赖关系型数据库实现事务

2.1.3.实现XA模式

Seata的starter已经完成了XA模式的自动装配,实现非常简单,步骤如下:

1)修改application.yml文件(每个参与事务的微服务),开启XA模式:

seata:
  data-source-proxy-mode: XA

2)给发起全局事务的入口方法添加 @GlobalTransactional注解:

2.2.AT模式

AT模式同样是分阶段提交的事务模型,不过缺弥补了XA模型中资源锁定周期过长的缺陷。

2.2.1基本流程图:

分布式事务

阶段一RM的工作:

  • 注册分支事务
  • 记录undo-log(数据快照)
  • 执行业务sql并提交
  • 报告事务状态

阶段二提交时RM的工作:

  • 删除undo-log即可

阶段二回滚时RM的工作:

  • 根据undo-log恢复数据到更新前
2.2.2.AT与XA的区别

简述AT模式与XA模式最大的区别是什么?

  • XA模式一阶段不提交事务,锁定资源;AT模式一阶段直接提交,不锁定资源。
  • XA模式依赖数据库机制实现回滚;AT模式利用数据快照实现数据回滚。
  • XA模式强一致;AT模式最终一致
2.2.3.优缺点

AT模式的优点:

  • 一阶段完成直接提交事务,释放数据库资源,性能比较好
  • 利用全局锁实现读写隔离
  • 没有代码侵入,框架自动完成回滚和提交

AT模式的缺点:

  • 两阶段之间属于软状态,属于最终一致
  • 框架的快照功能会影响性能,但比XA模式要好很多

Original: https://www.cnblogs.com/sy2022/p/16526294.html
Author: 你会很厉害的
Title: 分布式事务

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/593743/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 简单的java实现滑动时间窗口限流算法

    在网上搜滑动时间窗口限流算法,大多都太复杂了,本人实现了个简单的,先上代码: package cn.dijia478.util; import java.time.LocalTim…

    Java 2023年6月9日
    059
  • 从ReentrantLock的实现看AQS的原理及应用

    转载的美团技术文档,写的不错,推荐: posted @2021-03-02 12:31 轨迹320 阅读(48 ) 评论() 编辑 Original: https://www.cn…

    Java 2023年6月5日
    0100
  • 从0到1写一款自动为Markdown标题添加序号的Jetbrains插件

    1. markdown-index 最近做了一个Jetbrains的插件,叫 markdown-index,它的作用是为Markdown文档的标题自动添加序号,效果如下: 目前已经…

    Java 2023年6月7日
    098
  • 有意思的面试记录

    碰见一个很有意思的【百度面试】,和我好像hhh链接:https://www.bilibili.com/video/BV18Z4y1T7yZ/ 【类加载机制】类加载过程:加载+链接+…

    Java 2023年6月7日
    098
  • Python爬虫

    1.scrapy框架有哪几个组件/模块? 2.简单说一下scrapy工作流程。 3.scrapy指纹去重原理和scrappy-redis的去重原理? 4.请简要介绍下scrapy框…

    Java 2023年6月7日
    077
  • Oracle删除表空间和用户

    删除oracle用户和表空间的方法 删除用户 删除表空间 删除空的表空间,不包含物理文件 删除空表空间,包含物理文件 删除非空表空间,不包含物理文件 删除非空表空间,包含物理文件 …

    Java 2023年6月5日
    077
  • Spring Boot使用AOP实现REST接口简易灵活的安全认证

    我们继续上一篇文章的分析,本文将通过AOP的方式实现一个相对更加简易 灵活的API安全认证服务。 我们先看实现,然后介绍和分析AOP基本原理和常用术语。 一、Authorized实…

    Java 2023年5月30日
    089
  • 二十一、XML

    二十一、XML 21.1 XML介绍 21.1.1 一个问题引入 XML 思考:前面的反射可以加载配置文件里的信息,获取类的字节码对象从而动态创建对象和调用方法,但是如果需要创建多…

    Java 2023年6月5日
    072
  • 编程逻辑

    大部分高级编程语言虽然语法不同,编译器不同,学习它们的小哥哥小姐姐们不同,但有一点却是出奇地一致:编程逻辑! 有些刚入行或刚入门的童鞋可能连编程是啥意思都没弄懂,一下子又来了个「逻…

    Java 2023年6月7日
    087
  • centos中NAT模式下静态IP连接外网

    使用linux虚拟机时,通常会用到yum命令来安装软件,然而这个命令需要连外网下载软件,用maven下载jar包也需要外网。虚拟机在内网可以互相ping通,然而ping不了外网,于…

    Java 2023年6月16日
    071
  • JDK成长记19:ReenranctLock(2)加锁入队的AQS底层原理

    上一节,你应该学到了ReentrantLock底层基于AQS的3个小组件 state、owner、queue。并且了解了下一个线程1进行加锁修改owner和state的过程。还记得…

    Java 2023年6月5日
    097
  • 丰富Bean的配置

    关于Bean是如何配置的,大家并不陌生。毕竟前文曾有涉及,虽然比较粗浅。却也介绍了如何写份XML配置文件,告诉Spring容器怎样创建Bean,怎样注入依赖,等等。其中要点如下:1…

    Java 2023年6月5日
    066
  • springboot集成websocket的两种实现方式

    WebSocket跟常规的http协议的区别和优缺点这里大概描述一下 一、websocket与http http协议是用在应用层的协议,他是基于tcp协议的,http协议建立链接也…

    Java 2023年5月30日
    076
  • Ajax

    AJAX(Asynchronous Javascript And Xml) 传统请求及缺点 传统的请求都有哪些? 直接在浏览器地址栏上输入URL。 点击超链接 提交form表单 使…

    Java 2023年6月6日
    075
  • 本BLOG迁移到javaeye

    本BLOG迁移到javaeye,地址http://jackyrong.javaeye.com Original: https://www.cnblogs.com/jackyrong…

    Java 2023年5月29日
    091
  • Linux 终端运行命令时出现多行带有加号的信息(详见文章内容)

    ++_vte_ prompt_ command +++ HISTTIMEFORMAT= +++ history 1 +++ sed ‘s/^ *[0-9] \+ *//’ ++ l…

    Java 2023年6月8日
    074
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球