首页 > 其他分享 >分布式事务Seata中的XA和AT区别,通俗易懂!

分布式事务Seata中的XA和AT区别,通俗易懂!

时间:2024-03-14 19:30:37浏览次数:18  
标签:事务 Seata 本地 XA num 提交 全局 分布式

首先得知道二个概念:

1、CAP理论

CAP是指在分布式系统下,系统包含C、A、P三个要素,并且三者不可兼得。
C:  一致性:同一个数据在同一时刻是相同的
A:  可用性:即系统出错误,但在一定时间范围内仍能够正确的响应用户请求
P:  分区容错性:即某节点或网络分区故障时,系统仍能够提供满足一致性和可用性的服务。

三者只能是CP(强一致性)或者AP(高可用性)

其中, XA就是CP的类型,也就是强一致性,而AT就是AP的类型,也就是最终一致性,中间状态可能会不一样。

2、Seata 的核心组件:

事务协调器(TC):可以理解为 开启/关闭全局锁 和 发送提交/回滚指令 的工具;
事务管理器(TM):负责全局事务的提交或回滚;
资源管理器(RM):接受TC的命令,负责本地事物的提交或回滚;


下面通过举例简述XA和AT的实现原理:

假如有一个字段 num=100,a, b两个事务,都在执行update num=num-10的操作。

XA的简单实现:

  1. 首先把a, b的事务状态设置为prepare,并且获取全局锁;
  2. a执行本地事务num=num-10之后,此时num=90;
  3. b执行本地事务num=num-10以后,此时num=80;
  4. 事务协调器TC发送指令给事务管理器TM将全局事务提交;
  5. TM收到提交全局事务的指令,就让a,b一起提交本地事务;
  6. 直到两个事务都提交完成之后,才释放全局锁。

        也就是完全同步的思想,两个都完成了才一起提交,完成之前,a,b操作的相关数据动弹不得,效率非常之低!

AT的简单实现:

  1. 首先a先执行本地事务,num=num-10;
  2. 在a提交本地事务之前,会拿到全局锁,这个全局锁就是当前num的值,也就是90,a拿到全局锁之后提交本地事务;
  3. 然后b开始执行本地事务num=num-10;
  4. b在提交本地事务之前,也会去拿全局锁,因为此时全局锁的值是90,假如b拿到的不是90,他就会一直cas重试,直至回滚。假如b拿到的是90,那就直接提交b的本地事务即可;
  5. 最后因为b是最后一个本地事务,提交成功后释放全局锁。

        那为什么b拿到的可能不是90:因为a的本地事务已经提交了,所以在b本地事务提交之前,a的值可能会被a的本地事务改变。(也就是脏读)

        那他效率为什么比XA快:因为XA是在一开始就锁定所有资源,直至所有本地事务成功,才一起提交,而at只是在提交之前获取全局锁,如果值是正常的没一点关系,直接过,不影响你a操作,如果不是正常的,才会自旋阻塞!当然这只是两个事务,假如a,b,c,d,e五个事务,那我此时a,b,c,d,e执行完后就可以直接提交自己的本地事务,不会影响其它四个事务,只有正在修改的数据被别人修改以后才会阻塞!而XA直接是五个事务动弹不得!

        应该是非常的通俗易懂,有疑问的可以在评论区留言!!!

ps:以下是我整理的java面试资料,感兴趣的可以看看。最后,创作不易,觉得写得不错的可以点点关注!

链接:https://www.yuque.com/u39298356/uu4hxh?# 《Java面试宝典》 

标签:事务,Seata,本地,XA,num,提交,全局,分布式
From: https://blog.csdn.net/qq_53281187/article/details/136639654

相关文章

  • 内存缓存和分布式缓存
    参考官方文档:https://learn.microsoft.com/zh-cn/aspnet/core/performance/caching/overview?view=aspnetcore-6.0内存中缓存可以存储任何对象。分布式缓存接口仅限于byte[],应用程序需要自行解决针对缓存对象的序列化和反序列化问题。内存中和分布式缓存都将缓存项存储为键值......
  • OceanBase初体验之部署生产标准的三节点分布式集群
    前置条件OceanBase数据库集群至少由三个节点组成,所以先准备好3台服务器:IP配置操作系统x.x.x.150Intelx8612C64G内存1TSSDCentOS7.9x.x.x.155Intelx8612C64G内存1TSSDCentOS7.9x.x.x.222Intelx8612C64G内存1TSSDCentOS7.9关于运行......
  • 容器集群实现多机多卡分布式微调大模型chatglm2-6b(deepseed + LLaMA + NCCL)
    环境信息2台物理机(187.135,187.136),各两张p4显卡,安装好docker=20.10.0,安装好nvidia驱动(driverversion=470.223.02,cudaversion=11.4)构造容器集群(dockerswarm187.136节点作为manager节点,187.135节点作为worker节点)[root@host-136~]#dockerswarminit--advertise-addr......
  • Hadoop大数据应用:Linux 部署 HDFS 分布式集群
    目录  一、实验1.环境2.Linux部署HDFS分布式集群3.Linux使用 HDFS文件系统二、问题1.ssh-copy-id报错2.如何禁用sshkey检测3.HDFS有哪些配置文件4.hadoop查看版本报错5.启动集群报错6.hadoop的启动和停止命令7.上传文件报错8.HDFS使用命令  ......
  • 微服务分布式springcloud研究生志愿填报辅助系统
    本文讲述了研究生志愿填报辅助系统。结合电子管理系统的特点,分析了研究生志愿填报辅助系统的背景,给出了研究生志愿填报辅助系统实现的设计方案。本论文主要完成不同用户的权限划分,不同用户具有不同权限的操作功能,在用户模块,主要有用户进行注册和登录,用户可以实现查看院校信息......
  • 一个开源的分布式在线教育系统
    大家好,我是Java陈序员。今天给大家介绍一个开源的分布式在线教育系统,支持课程在线播放、课程购买等功能。关注微信公众号:【Java陈序员】,获取开源项目分享、AI副业分享、超200本经典计算机电子书籍等。项目介绍roncoo-education——一个分布式在线教育系统。目前主要功能......
  • XADC采集外部信号实时显示在RGB屏幕中
    概述XADC在Xilinx7系列器件上可用。TheXADCisavailableinallArtix-7,Kintex-7,Virte-7,andZynq-7000SoCdevices.XADC需要例化使用,但是如果使用JTAG访问的话,就不需要例化,直接在Vivado软件中就可以直接访问XADC的各项数据,包括芯片温度、电压等数据。The......
  • DiagnosticSource DiagnosticListener 无侵入式分布式跟踪
    ASP.NETCore中的框架中发出大量诊断事件,包括当前请求进入请求完成事件,HttpClient发出收到与响应,EFCore查询等等。我们可以利用DiagnosticListener来选择性地监听这些事件,然后通过自己的方式组织这些日志,实现无侵入的分布式跟踪。下面我们通过DiagnosticSource监听EFCore,与HTTP......
  • 一致性哈希算法及其在分布式系统中的应用
    摘要本文将会从实际应用场景出发,介绍一致性哈希算法(ConsistentHashing)及其在分布式系统中的应用。首先本文会描述一个在日常开发中经常会遇到的问题场景,借此介绍一致性哈希算法以及这个算法如何解决此问题;接下来会对这个算法进行相对详细的描述,并讨论一些如虚拟节点等与此算......
  • 考虑功率均分与电压频率的事件触发分布式二次控制MATLAB模型
    微❤关注“电气仔推送”获得资料(专享优惠)模型简介此模型是在《基于事件触发机制的孤岛微电网二次电压与频率协同控制MATLAB仿真模型》上进一步创作的,之前的模型只考虑了二次电压与频率控制,并没有考虑均分这一项点。因此此模型在事件触发机制的基础上,继续创作了基于事件触发......