面试集中营—Seata分布式事务

news2024/11/28 0:40:14

一、分布式事务

本地事务

        在计算机系统中,更多的是通过关系型数据库来控制事务,这是利用数据库本身的事务特性来实现的, 因此叫数据库事务,由于应用主要靠关系数据库来控制事务,而数据库通常和应用在同一个服务器,所以基于关系型数据库的事务又被称为本地事务。
        数据库事务的四大特性:ACID
         A Atomic :原子性,构成事务的所有操作,要么都执行完成,要么全部不执行,不可能出现部分成功部分失败的情况。
        C( Consistency :一致性,在事务执行前后,数据库的一致性约束没有被破坏。比如:张三向李四转100 元,转账前和转账后的数据是正确状态这叫一致性,如果出现张三转出 100 元,李四账户没有增加
100 元这就出现了数 据错误,就没有达到一致性。
        I( Isolation :隔离性,数据库中的事务一般都是并发的,隔离性是指并发的两个事务的执行互不干扰,一个事务不能看到其他事务的运行过程的中间状态。通过配置事务隔离级别可以比避免脏读、重复读问题。
        D( Durability :持久性,事务完成之后,该事务对数据的更改会持久到数据库,且不会被回滚。数据库事务在实现时会将一次事务的所有操作全部纳入到一个不可分割的执行单元,该执行单元的所有操作要么都成功,要么都失败,只要其中任一操作执行失败,都将导致整个事务的回滚。
 

分布式事务

        随着互联网的快速发展,软件系统由原来的单体应用转变为分布式应用分布式系统会把一个应用系统拆分为可独立部署的多个服务,因此需要服务与服务之间远程协作才能完成事务操作,这种分布式系统环境下由不同的服务之间通过网络远程协作完成事务称之为 分布式事务,例如用户注册送积分事务、创建订单减库存事务,银行转账事务等都是分布式事务。
 

二、分布式事务理论

CAP理论

        CAP理论:一个分布式系统不可能同时满足一致性,可用性和分区容错性这个三个基本需求,最多只能同时满足其中两项
        一致性(C):数据在多个副本之间是否能够保持一致的特性。
        可用性(A):是指系统提供的服务必须一致处于可用状态,对于每一个用户的请求总是在有限的时间内返回结果,超过时间就认为系统是不可用的
        分区容错性(P):分布式系统在遇到任何网络分区故障的时候,仍然需要能够保证对外提供满足一致性和可用性的服务,除非整个网络环境都发生故障。
        放弃A(CP):其做法是一旦系统遇到网络分区或其他故障时,那受到影响的服务需要等待一定的时间,应用等待期间系统无法对外提供正常的服务,即不可用
        放弃C(AP):这里说的放弃一致性,并不是完全不需要数据一致性,是指放弃数据的强一致性,保留数据的最终一致性。
 

BASE理论

        BASE是基本可用,软状态,最终一致性。是对CAP中一致性和可用性权限的结果,是基于CAP定理演化而来的,核心思想是即使无法做到强一致性,但每个应用都可以根据自身的业务特定,采用适当的方式来使系统达到最终一致性
 

三、分布式事务解决方案

2PC提交

        二阶段提交协议是将事务的提交过程分成提交事务请求和执行事务提交两个阶段进行处理。
        
         阶段1:提交事务请求
  1. 事务询问:协调者向所有的参与者发送事务内容,询问是否可以执行事务提交操作,并开始等待各参与者的响应
  2. 执行事务:各参与者节点执行事务操作,并将Undo和Redo信息记入事务日志中
  3. 如果参与者成功执事务操作,就反馈给协调者Yes响应,表示事物可以执行,如果没有成功执行事务,就反馈给协调者No响应,表示事务不可以执行
        阶段一也被称为投票阶段,即各参与者投票票表明是否可以继续执行接下去的事务提交操作
        
         阶段二:执行事务提交
  1. 假如协调者从所有的参与者或得反馈都是Yes响应,那么就会执行事务提交。
  2. 发送提交请求:协调者向所有参与者节点发出Commit请求
  3. 事务提交:参与者接受到Commit请求后,会正式执行事务提交操作,并在完成提交之后放弃整个事务执行期间占用的事务资源
  4. 反馈事务提交结果:参与者在完成事物提交之后,向协调者发送ACK消息
  5. 完成事务:协调者接收到所有参与者反馈的ACK消息后,完成事务

3PC提交

        三阶段提,也叫三阶段提交协议,是二阶段提交(2PC)的改进版本。
        与两阶段提交不同的是,三阶段提交有两个改动点。引入超时机制。同时在协调者和参与者中都引入超时机制。在第一阶段和第二阶段中插入一个准备阶段。保证了在最后提交阶段之前各参与节点的状态是一致的。
        三阶段提交就有CanCommit、PreCommit、DoCommit三个阶段。
 

TCC分布式事务

      TCC是服务化的两阶段编程模型,其Try、Confirm、Cancel,3个方法均由业务编码实现,TCC要求每个分支事务实现三个操作:预处理Try,确认Confirm,撤销Cancel。
        
  1. Try阶段是做业务检查(一致性)及资源预留(隔离),此阶段仅是一个初步操作,它和后续的Confirmy一起才能构成一个完整的业务逻辑
  2. Confirm阶段是做确认提交,Try阶段所有分支事务执行成功后开始执行Confirm,通常情况下,采用TCC则认为Confirm阶段是不会出错的,即:只要Try成功,Confirm一定成功,若Confirm阶段真的出错,需要引入重试机制或人工处理
  3. Cancel阶段是在业务执行错误需要回滚到状态下执行分支事务的取消,预留资源的释放,通常情况 下,采用TCC则认为Cancel阶段也一定是真功的,若Cance阶段真的出错,需要引入重试机制或人工处理

消息队列实现可靠消息最终一致性 

     
        可靠消息最终一致性就是保证消息从生产方经过消息中间件传递到消费方的一致性
        RocketMQ主要解决了两个功能:本地事务与消息发送的原子性问题。事务参与方接收消息的可靠性。可靠消息最终一致性事务适合执行周期长且实时性要求不高的场景,引入消息机制后,同步的事务操作变为基于消息执行的异步操作,避免分布式事务中的同步阻塞操作的影响,并实现了两个服务的解耦
        所以,消息队列的消息最终一致性并不是普通意义上的分布式事务,而是分开式事务,将事务分成不同的段然后依次执行,只要保证整条链路上的事务最终都执行成功即可(因为mq报错后会重新发送消息)
        
 

四、分布式事务中间件

      Atomikos

         这是一个兼容JTA/JTS标准的分布式事务管理器,可以在JVM中运行,并轻松集成到任何支持JTA标准的环境下。Atomikos支持XA事务模型,能够保证分布式事务在不同数据库和消息服务之间的一致性。基本只能用在单机环境,单机连接多个数据库的情况下保证事务的一致性;

      Himly

        金融级柔性分布式事务解决方案,一开始只支持TCC模式。当使用TCC模式的时候,用户根据自身业务需求提供 tryconfirmcancel 等三个方法, 并且 confirmcancel 方法由自身完成实现,框架只是负责来调用,来达到事务的一致性。后续增加了TAC模式。当用户使用TAC模式的时候,用户必须使用关系型数据库来进行业务操作,框架会自动生成回滚SQL, 当业务异常的时候,会执行回滚SQL来达到事务的一致性。

      LCN

        LCN框架在2017年6月份发布第一个版本,从开始的1.0,已经发展到了5.0版本。LCN名称是由早期版本的LCN框架命名。5.0以后由于框架兼容了LCN、TCC、TXC三种事务模式,为了避免区分LCN模式,特此将LCN分布式事务改名为TX-LCN分布式事务框架。
     TX-LCN定位于一款事务协调性框架,框架其本身并不操作事务,而是基于对事务的协调从而达到事务一致性的效果。

     Seata

      Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案

        还有例如EasyTransaction、ByteTCC等。

中间件名称Github地址star数量简介
Seatahttps://github.com/seata/seata25K阿里。目前全网最火最好用的中间件。
LCNhttps://github.com/codingapi/tx-lcn4.2K

CodingApi团队。依赖太多:Redis、Zookeeper、Consul;

停止更新四年(截止2024年5月)

Hmilyhttps://github.com/dromara/hmily4.1K

文档完善,SpringCloud与SpringBoot均支持,网上资料多。

7个月前更新(截止2024年5月)

ByteTCChttps://github.com/liuyangming/ByteTCC2.5K

ByteTCC是分布式事务管理器的一个实现,基于尝试确认-取消(TCC)机制。
ByteTCC与JTA兼容,可以与Spring和其他Java容器无缝集成。

停止更新两年(截止2024年5月)

EasyTransactionhttps://github.com/QNJR-GROUP/EasyTransaction2.4K

个人。(资料少、文档少)

停止更新四年(截止2024年5月)

        可以看到了现在基本上是Seata一统江湖的情况。

五、Seata

Seata术语    

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

生命周期

        TM要求TC开始新的全局事务。 TC生成表示全局事务的XID。
        XID通过微服务的调用链传播。
        RM将本地事务注册为XID到TC的相应全局事务的分支。
        TM要求TC提交或回滚XID的相应全局事务。
        TC在XID的相应全局事务下驱动所有分支事务,以完成分支提交或回滚。

 

AT模式

两阶段提交协议的演变:
        一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。
        二阶段:提交异步化,非常快速地完成。回滚通过一阶段的回滚日志进行反向补偿。
写隔离
        一阶段本地事务提交前,需要确保先拿到 全局锁
        拿不到 全局锁,不能提交本地事务。
        拿 全局锁 的尝试被限制在一定范围内,超出范围将放弃,并回滚本地事务,释放本地锁。

        

        流程图:

395f3fa67e3a45beb190bc27c90a5e68.png

        两个全局事务 tx1 和 tx2,分别对 a 表的 m 字段进行更新操作,m 的初始值 1000。
        tx1 先开始,开启本地事务,拿到本地锁,更新操作 m = 1000 - 100 = 900。本地事务提交前,先拿到该记录的 全局锁 ,本地提交释放本地锁。 tx2 后开始,开启本地事务,拿到本地锁,更新操作 m = 900 - 100 = 800。本地事务提交前,尝试拿该记录的 全局锁 ,tx1 全局提交前,该记录的全局锁被 tx1 持有,tx2 需要重试等待 全局锁
 

TCC模式

        TCC 模式,不依赖于底层数据资源的事务支持:
        一阶段 prepare 行为:调用 自定义 的 prepare 逻辑。
        二阶段 commit 行为:调用 自定义 的 commit 逻辑。
        二阶段 rollback 行为:调用 自定义 的 rollback 逻辑。
 

Saga 模式

        Saga模式是SEATA提供的长事务解决方案,在Saga模式中,业务流程中每个参与者都提交本地事务,当出现某一个参与者失败则补偿前面已经成功的参与者,一阶段正向服务和二阶段补偿服务都由业务开发实现
 
 
关于使用示例,请根据版本参考官网的文档
https://seata.apache.org/zh-cn/
 
 
 

参考:

分布式事务--TCC的中间件--选型/对比-CSDN博客

哔哩哔哩:1 阿里分布式事务框架Seata简介_哔哩哔哩_bilibili

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1668620.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SQLite利用事务实现批量插入(提升效率)

在尝试过SQLite批量插入一百万条记录,执行时长高达20多分钟后,就在想一个问题,这样的性能是不可能被广泛应用的,更不可能出现在真实的生产环境中,那么对此应该如何优化一下呢? 首先分析一下批量插入的逻辑 …

社交媒体数据恢复:脉脉

在使用社交软件脉脉的过程中,可能会遇到数据丢失的情况,如误删了重要信息或者更换手机后数据未能同步等问题。那么如何恢复脉脉中的数据呢?本文将为您提供详细的步骤指导。 注意:以下操作需要在脉脉账户登录状态下进行。 登录脉…

红米K60Pro/K50/K40系列澎湃OS解锁BL降级出厂MIUI14稳定版本方法

最新红米K60/60pro/K50/K50至尊/K40等多个系列手机都已经推送了澎湃OS系统,但新版的系统适配周期短或者等其他原因,导致很多小伙伴希望降级回到MIUI14系统,多个小米售后都拒绝降级服务,并且官方也没有开通1个自助降级的方法&#…

速戳!高考生做近视手术须知,避免错过心仪大学

距离高考还有不到一个月的时间,考生们在紧张复习的同时,不要忘了了解意向专业、院校的视力要求。一些专业和院校录取不仅靠实力,还需要“视力”,考了个好成绩却因视力不达标而被专业、院校退档,这样的结果是我们不想看到的。如果你想圆军旅梦、警校梦、航…

软考--信息系统项目管理师课程笔记

第一章 信息化发展 1.国家信息化:应用(上),技术(下),人才(左),规范(右) 2.广域网协议包括:ISDN,ASDL&#xf…

Android的视图显示和管理机制:layout view window WindowManager Canvas Surface

在Android系统中,Layout view window WindowManager Canvas Surface SurfaceFlinger这些组件协同工作,以实现图形的绘制和显示。需要搞明白这些组件是什么时候创建的以及他们之间的结构关系。 从上到下的层级关系:用户在View上进行操作&…

SQLite .journal 文件

在之前插入大量数据测试的时候,发现在数据库文件同级目录下会产生一个同名.journal的文件,并且不是一直会存在,而是生成一会就会自动删除,然后继续生成继续删除,直到数据插入完成。 初步猜测,应该是类似 re…

代码-功能-Python-运用bs4技术爬取汽车之家新闻信息

第三方库安装指令: pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple pip install BeautifulSoup4 -i https://pypi.tuna.tsinghua.edu.cn/simple 运行代码: #这个代码并不完整,有很大的问题,但目前不知道怎么…

05-Fortran基础--Fortran文件操作

05-Fortran基础--Fortran文件操作 0 引言1 文件操作有关的关键字介绍1.1 打开文件(OPEN)1.2 文件关闭(CLOSE)1.3 文件查询(INQUIRE)1.3 文件读写(read/write)1.4 文件操作符&#xf…

机器学习作业4——朴素贝叶斯分类器

目录 一、理论 一个例子: 二、代码 对于代码的解释: 1.fit函数: 2.predict函数: 三、实验结果 原因分析: 一、理论 朴素贝叶斯分类器基于贝叶斯定理进行分类,通过后验概率来判断将新数据归为哪一类。通过利用贝…

设计模式——结构型模式——代理模式(静态代理、动态代理:JDK、CGLIB)

目录 代理模式 代理模式简介 代理模式的分类 代理模式组成 代理模式的优缺点 静态代理 背景前置 编写代码 JDK动态代理 编写代码 使用Arthas分析JDK动态代理底层原理 CGLIB动态代理 编写代码 三种代理的对比 代理模式使用场景 代理模式 代理模式简介 代理模式属…

测试萌新三天速通python基础(二)列表,字符串,元组,字典,遍历,容器,集合,函数

python基础 字符串下标(索引)切片字符串的替换 replace()字符串拆分 split()字符串的连接 join列表 list列表的增删改查列表的反转 reverse()排序列表嵌套元组 tuple 排序 升序降序交换变量字典 dict查询遍历容器集合函数参数函数的嵌套调⽤函数的返回值模块导⼊的⽅法____name…

重发布和路由策略实验(课堂练习)

需求: 将1.1.1.0/24网段(不在OSPF中)重发布到网络中,不允许出现次优路径,实现全网可达。 需求分析: 1、在R1上重发布1.1.1.0/24网段,但是需要过滤192.168.12.0/24和192.168.13.0/24 2、在R2和R3…

【论文阅读笔记】MapReduce: Simplified Data Processing on Large Clusters

文章目录 1 概念2 编程模型3 实现3.1 MapReduce执行流程3.2 master数据结构3.3 容错机制3.3.1 worker故障3.3.2 master故障3.3.3 出现故障时的语义 3.4 存储位置3.5 任务粒度3.6 备用任务 4 扩展技巧4.1 分区函数4.2 顺序保证4.3 Combiner函数4.4 输入和输出的类型4.5 副作用4.…

【超详细】跑通YOLOv8之深度学习环境配置2

环境配置2下载安装内容如下: CUDA:https://developer.nvidia.com/cuda-toolkit-archive cudnn:https://developer.nvidia.com/rdp/cudnn-archive 版本:CUDA11.3 cudnn8.9.7 CUDA安装 简介 CUDA(Compute Unified De…

【superset】基于MySQL的BI数据分析可视化实战案例(已更新)

1.熟悉、梳理、总结下superset可视化分析实战案例知识体系,一直想探索有效可用的可视化分析方案,大多收费或不好用,这里,借此机会总结、更新下。 2.复杂度高,遇到并解决的问题较多,尝试了很多次。 3.欢迎批评指正,跪谢一键三连! 基于MySQL的BI数据分析可视化实战案例文…

免费剪辑的素材资源网站,超高清、可商用、不限速、无版权,迅速有效的解决您的视频剪辑难题!

在数字媒体时代,高质量的剪辑素材已成为视频制作的核心资源。下面为您推荐的优质视频剪辑素材网站,都提供超高清、无限速、无版权、可商用的素材,这些网站将大大提升您的视频制作效率和质量 01. 蛙学府 实用性:★★★★☆ 丰富性&…

容器化Jenkins远程发布java应用(方式一:pipline+ssh)

1.创建pipline工程 2.准备工程Jenkinsfile文件(java目录) 1.文件脚本内容 env.fileName "planetflix-app.jar" env.configName "planetflix_prod" env.remoteDirectory "/data/project/java" env.sourceFile "/…

百度云防护如何开启CC攻击防护

百度云防护的最重要的功能是可以CC攻击防护,针对CC攻击,百度云防护有被动的CC攻击拦截规则,也有主动自定义访问策略拦截。 今天百度云来教大家如何开启百度云防护的CC攻击防御功能。 1.进入防护模板功能-创建模板 2.开启CC攻击防御功能&…

Windows单机部署RocketMQ5.X并与SpringBoot集成

RocketMQ 5.X下载 《RocketMQ 5.X下载》 下载后,解压缩 修改初始内存 修改runserver.cmd(Linux则为runserver.sh) 将下面的-Xms2g -Xmx2g -Xmn1g调小 if %JAVA_MAJOR_VERSION% lss 17 (set "JAVA_OPT%JAVA_OPT% -server -Xms2g -X…