再问你一遍,你真的了解分布式事务吗?
ccwgpt 2024-09-26 07:51 26 浏览 0 评论
对于分布式事务的概念,可能还有很多朋友不理解或者理解得不是很深刻,本文将带大家一文吃透“分布式事务”。
本地事务
事务 Transaction 由一组 SQL 组成,具有四个 ACID 特性:
- Atomicity:原子性,构成事务的一组SQL,要么全部生效,要么全不生效,不会出现部分生效的情况。
- Consistency:一致性,数据库经过事务操作后从一种状态转变为另一个状态。可以说原子性是从行为上描述,而一致性是从结果上描述。
- Isolation:隔离性,事务操作的数据对象相对于其他事务操作的数据对象相互隔离,互不影响。
- Durability:持久性,事务提交后,其结果就是永久性的,即使发生宕机(非磁盘损坏)。
事务实现
对于 MySQL 数据库(InnoDB 存储引擎)而言,隔离性是通过不同粒度的锁机制来实现事务间的隔离。
原子性、一致性和持久性通过 redo log 重做日志和 undo log 回滚日志来保证的。
redo log:当数据库对数据做修改的时候,需要把数据页从磁盘读到 buffer pool 中,然后在 buffer pool 中进行修改。
那么这个时候 buffer pool 中的数据页就与磁盘上的数据页内容不一致,称 buffer pool 的数据页为 dirty page 脏数据。
如果这个时候发生非正常的 DB 服务重启,那么这些数据还没在内存,并没有同步到磁盘文件中(注意,同步到磁盘文件是个随机 IO),也就是会发生数据丢失。
如果这个时候,能够在有一个文件,当 buffer pool 中的 data page 变更结束后,把相应修改记录记录到这个文件(注意,记录日志是顺序 IO)。
那么当 DB 服务发生 crash 的情况,恢复 DB 的时候,也可以根据这个文件的记录内容,重新应用到磁盘文件,数据保持一致。
undo log:undo 日志用于存放数据被修改前的值,如果修改出现异常,可以使用 undo 日志来实现回滚操作,保证事务的一致性。另外 InnoDB MVCC 事务特性也是基于 undo 日志实现的。
undo 日志分为 insert undo log(insert 语句产生的日志,事务提交后直接删除)和 update undo log(delete 和 update 语句产生的日志,由于该 undo log 可能提供 MVVC 机制使用,所以不能再事务提交时删除)。
问题引入
CAP 理论
CAP 原则又称 CAP 定理,指的是在一个分布式系统中的一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。
CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。但由于在分布式系统中,分区容错性必然存在,所以只能在一致性和可用性妥协。
传统的 DBMS,如 MySQL 其实 CA 组合,在主从架构下,读写分离的情况下,是牺牲一定的一致性的(主从延迟)。
Base 理论:
- base available,基本可用,分布式系统在出现故障时,允许损失部分可用功能,保证核心功能可用。
- soft state,软状态,允许系统中存在中间状态,这个状态不影响系统可用性。
- eventually consistent,最终一致性,系统的中间状态经过短暂的时间后到达一致状态。
如何解决
场景举例
考虑这样一种业务场景,系统 A 调用系统 B 的退款服务进行退款,系统 A 更改内部退款状态,接着调用系统 C 的短信服务通知用户。
在这样的一个场景下,由于网络不可靠的必然存在,存在 A、B、C 三个系统之间一致性的问题。
本地表
针对上述场景,设计两张表:退款记录表和短信发送记录表以及相应的补偿 Job。
具体实现过程:
- 新增退款记录表,状态为处理中。
- 调用系统 B 的退款服务进行退款。
- 更新退款记录状态为对应的状态(成功/失败)。
- 如果退款成功,则新增短信发送记录,记录状态为待发送。
- 调用系统 C 的短信服务,发送短信。
- 更新短信发送记录为已发送。
退款补偿 Job,查询退款记录表中处理中的记录,调用系统 B 的退款服务,退款成功处理:
- 新增短信发送记录,记录状态为待发送。
- 调用系统 C 的短信服务,发送短信。
- 更新短信发送记录为已发送。
短信通知补偿 Job,查询短信发送记录中待发送的记录,调用系统 C 的短信服务:
- 调用系统 C 的短信服务,发送短信。
- 更新短信发送记录为已发送。
注意:
- 系统 B 和系统 C 需要根据调用方传的 uuid 支持幂等。
- 系统 A、B、C 会出现短暂的不一致,但最终一致。
事务消息
可以将其视为两阶段提交消息实现,以确保分布式系统中的最终一致性。事务性消息可确保本地事务的执行和消息的发送可以原子方式执行。
但是由于事务消息异步的特性,调用方拿不到消费方的处理结果,适用于不关心对方的返回结果/对方负责保证处理成功。
针对上述场景,增加两个事务消息的方式解决一致性问题,系统 A 通过发送事务消息的方式与系统 B 和系统 C 进行交互。
具体实现过程:
- 发送退款的事务消息。
- 新增退款记录,状态为:处理中。
- Commit 退款事务消息。
提供 MQ 事务 callback:
- 退款 callback 查询:有退款记录且为处理中则 Commit;其他则 Rollback。
- 发送短信 callback 查询:有退款记录且成功则 Commit;其他则 Rollback。
退款同步 Job,查询退款记录表中处理中的记录,调用系统 B 的退款查询接口同步状态,其中退款成功处理:
- 发送短信的事务消息
- 更新退款记录为成功
- Commit 短信事务消息
相关理论
二阶段提交
二阶段提交是解决分布式事务问题的重要理论基础,但也存在着明显的问题:
- 阻塞问题,参与者将协议消息发送给协调器后,它将阻塞直到收到提交或回滚,只能依赖协调者的超时机制。
- 协调者单点问题,如果协调者出现故障,则某些参与者将一直无法收到提交或回滚的消息。
为了解决二阶段提交出现的问题,又有了三阶段提交(Three-phase commit):
- 解决阻塞问题:将 2PC 中的第一阶段一分为二,提供了一个 CanCommit 阶段,此阶段并不锁定资源,这样可以大幅降低阻塞概率。
- 解决单点问题:在参与者这边也引入了超时机制。
DTP Model
X/Open 分布式事务处理 DTP(Distributed Transaction Processing)模型是一种软件体系架构,已经成为事实上的事务模型组件的行为标准。
它允许多个应用程序共享由多个资源管理器提供的资源,并允许其工作被协调为全局事务:
- ApplicationProgram(AP),应用程序定义了事务边界并指定构成事务的操作。
- ResourceManager(RM),资源管理器用来管理我们需要访问的共享资源,我们可以将它理解为关系数据库、文件存储系统、消息队列、打印机等。
- TransactionManager(TM),事务管理器是一个独立的组件,他为事务分配标识符并监视事务的执行情况,负责事务完成和故障恢复。
- CommunicationResourceManager(CRM),通信资源管理器控制一个或多个 TM domain 之间分布式应用的通信。
XA Specification:XA 规范是 X/Open 关于分布式事务处理(DTP)的规范。规范描述了全局的事务管理器与局部的资源管理器之间的接口。
XA 规范的目的是允许多个资源(如数据库,应用服务器,消息队列,等等)在同一事务中访问,这样可以使 ACID 属性跨越应用程序而保持有效。
XA 使用两阶段提交来保证所有资源同时提交或回滚任何特定的事务。
XA 规范描述了资源管理器要支持事务性访问所必需做的事情。
TCC
Saga
在 Saga 模式下,分布式事务内有多个参与者,每一个参与者都是一个冲正补偿服务,需要用户根据业务场景实现其正向操作和逆向回滚操作。
分布式事务执行过程中,依次执行各参与者的正向操作,如果所有正向操作均执行成功,那么分布式事务提交。
如果任何一个正向操作执行失败,那么分布式事务会去退回去执行前面各参与者的逆向回滚操作,回滚已提交的参与者,使分布式事务回到初始状态。
Saga 模式下分布式事务通常是由事件驱动的,各个参与者之间是异步执行的,Saga 模式是一种长事务解决方案。
Saga 模式的优势是:
- 一阶段提交本地数据库事务,无锁,高性能。
- 参与者可以采用事务驱动异步执行,高吞吐。
- 补偿服务即正向服务的“反向”,易于理解,易于实现。
缺点:Saga 模式由于一阶段已经提交本地数据库事务,且没有进行“预留”动作,所以不能保证隔离性。
开源项目
Seata
Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。支持 AT、TCC、Saga、XA 四种模式,对微服务框架支持友好。
如下图所示,Seata 中有三大模块,分别是 TM、RM 和 TC。其中 TM 和 RM 是作为 Seata 的客户端与业务系统集成在一起,TC 作为 Seata 的服务端独立部署:
- TC:事务协调者,维护全局和分支事务的状态,驱动全局事务提交或回滚。
- TM:事务管理器,定义全局事务的范围:开始全局事务、提交或回滚全局事务。
- RM:资源管理器,管理分支事务处理的资源,与 TC 交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
在 Seata 中,分布式事务的执行流程:
- TM 开启分布式事务(TM 向 TC 注册全局事务记录)。
- 按业务场景,编排数据库、服务等事务内资源(RM 向 TC 汇报资源准备状态 )。
- TM 结束分布式事务,事务一阶段结束(TM 通知 TC 提交/回滚分布式事务)。
- TC 汇总事务信息,决定分布式事务是提交还是回滚。
- TC 通知所有 RM 提交/回滚资源,事务二阶段结束。
①AT 模式
AT 模式是一种无侵入的分布式事务解决方案。
在 AT 模式下,用户只需关注自己的“业务 SQL”,用户的 “业务 SQL” 作为一阶段,Seata 框架会自动生成事务的二阶段提交和回滚操作。
- 一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。
- 二阶段:提交异步化,非常快速地完成。回滚通过一阶段的回滚日志进行反向补偿。
在一阶段,Seata 会拦截“业务 SQL”,首先解析 SQL 语义,找到“业务 SQL”要更新的业务数据,在业务数据被更新前,将其保存成“before image”,然后执行“业务 SQL”更新业务数据,在业务数据更新之后,再将其保存成“after image”,最后生成行锁。
以上操作全部在一个数据库事务内完成,这样保证了一阶段操作的原子性。
②TCC 模式
一个分布式的全局事务,整体是两阶段提交的模型。全局事务是由若干分支事务组成的,分支事务要满足两阶段提交的模型要求,即需要每个分支事务都具备自己的:
- 一阶段 prepare 行为。
- 二阶段 commit 或 rollback 行为。
TCC 模式,不依赖于底层数据资源的事务支持:
- 一阶段 prepare 行为:调用自定义的 prepare 逻辑。
- 二阶段 commit 行为:调用自定义的 commit 逻辑。
- 二阶段 rollback 行为:调用自定义的 rollback 逻辑。
所谓 TCC 模式,是指支持把 自定义 的分支事务纳入到全局事务的管理中。
③Saga 模式
目前 Seata 提供的 Saga 模式是基于状态机引擎来实现的,机制是:
- 通过状态图来定义服务调用的流程并生成 json 状态语言定义文件。
- 状态图中一个节点可以是调用一个服务,节点可以配置它的补偿节点。
- 状态图 json 由状态机引擎驱动执行,当出现异常时状态引擎反向执行已成功节点对应的补偿节点将事务回滚 (异常发生时是否进行补偿也可由用户自定义决定)。
- 可以实现服务编排需求,支持单项选择、并发、子流程、参数转换、参数映射、服务执行状态判断、异常捕获等功能。
状态机引擎原理:
- 图中的状态图是先执行 stateA,再执行 stateB,然后执行 stateC。
- "状态"的执行是基于事件驱动的模型,stateA 执行完成后,会产生路由消息放入 EventQueue,事件消费端从 EventQueue 取出消息,执行 stateB。
- 在整个状态机启动时会调用 Seata Server 开启分布式事务,并生产 xid,然后记录"状态机实例"启动事件到本地数据库。
- 当执行到一个"状态"时会调用 Seata Server 注册分支事务,并生产 branchId,然后记录"状态实例"开始执行事件到本地数据库。
- 当一个"状态"执行完成后会记录"状态实例"执行结束事件到本地数据库,然后调用 Seata Server 上报分支事务的状态。
- 当整个状态机执行完成, 会记录"状态机实例"执行完成事件到本地数据库,然后调用 Seata Server 提交或回滚分布式事务。
相关推荐
- 详解DNFSB2毒王的各种改动以及大概的加点框架
-
首先附上改动部分,然后逐项分析第一个,毒攻掌握技能意思是力量智力差距超过15%的话差距会被强行缩小到15%,差距不到15%则无效。举例:2000力量,1650智力,2000*0.85=1700,则智力...
- 通篇干货!纵观 PolarDB-X 并行计算框架
-
作者:玄弟七锋PolarDB-X面向HTAP的混合执行器一文详细说明了PolarDB-X执行器设计的初衷,其初衷一直是致力于为PolarDB-X注入并行计算的能力,兼顾TP和AP场景,逐渐...
- 字节新推理模型逆袭DeepSeek,200B参数战胜671B,豆包史诗级加强
-
梦晨发自凹非寺量子位|公众号QbitAI字节最新深度思考模型,在数学、代码等多项推理任务中超过DeepSeek-R1了?而且参数规模更小。同样是MoE架构,字节新模型Seed-Thinkin...
- 阿里智能化研发起飞!RTP-LLM 实现 Cursor AI 1000 token/s 推理技术揭秘
-
作者|赵骁勇阿里巴巴智能引擎事业部审校|刘侃,KittyRTP-LLM是阿里巴巴大模型预测团队开发的高性能LLM推理加速引擎。它在阿里巴巴集团内广泛应用,支撑着淘宝、天猫、高德、饿...
- 多功能高校校园小程序/校园生活娱乐社交管理小程序/校园系统源码
-
校园系统通常是为学校、学生和教职工提供便捷的数字化管理工具。综合性社交大学校园小程序源码:同城校园小程序-大学校园圈子创业分享,校园趣事,同校跑腿交友综合性论坛。小程序系统基于TP6+Uni-app...
- 婚恋交友系统nuiAPP前端解决上传视频模糊的问题
-
婚恋交友系统-打造您的专属婚恋交友平台系统基于TP6+Uni-app框架开发;客户移动端采用uni-app开发,管理后台TH6开发支持微信公众号端、微信小程序端、H5端、PC端多端账号同步,可快速打包...
- 已节省数百万GPU小时!字节再砍MoE训练成本,核心代码全开源
-
COMET团队投稿量子位|公众号QbitAI字节对MoE模型训练成本再砍一刀,成本可节省40%!刚刚,豆包大模型团队在GitHub上开源了叫做COMET的MoE优化技术。COMET已应用于字节...
- 通用电气完成XA102发动机详细设计审查 将为第六代战斗机提供动力
-
2025年2月19日,美国通用电气航空航天公司(隶属于通用电气公司)宣布,已经完成了“下一代自适应推进系统”(NGAP)计划下提供的XA102自适应变循环发动机的详细设计审查阶段。XA102是通用电气...
- tpxm-19双相钢材质(双相钢f60材质)
-
TPXM-19双相钢是一种特殊的钢材,其独特的化学成分、机械性能以及广泛的应用场景使其在各行业中占有独特的地位。以下是对TPXM-19双相钢的详细介绍。**化学成分**TPXM-19双相钢的主要化学成...
- thinkphp6里怎么给layui数据表格输送数据接口
-
layui官网已经下架了,但是产品还是可以使用。今天一个朋友问我怎么给layui数据表格发送数据接口,当然他是学前端的,后端不怎么懂,自学了tp框架问我怎么调用。其实官方文档上就有相应的数据格式,js...
- 完美可用的全媒体广告精准营销服务平台PHP源码
-
今天测试了一套php开发的企业网站展示平台,还是非常不错的,下面来给大家说一下这套系统。1、系统架构这是一套基于ThinkPHP框架开发的HTML5响应式全媒体广告精准营销服务平台PHP源码。现在基于...
- 一对一源码开发,九大方面完善基础架构
-
以往的直播大多数都是一对多进行直播社交,弊端在于不能满足到每个用户的需求,会降低软件的体验感。伴随着用户需求量的增加,一对一直播源码开始出现。一个完整的一对一直播流程即主播发起直播→观看进入房间观看→...
- Int J Biol Macromol .|交联酶聚集体在分级共价有机骨架上的固定化:用于卤代醇不对称合成的高稳定酶纳米反应器
-
大家好,今天推送的文章发表在InternationalJournalofBiologicalMacromolecules上的“Immobilizationofcross-linkeden...
- 【推荐】一款开源免费的 ChatGPT 聊天管理系统,支持PC、H5等多端
-
如果您对源码&技术感兴趣,请点赞+收藏+转发+关注,大家的支持是我分享最大的动力!!!项目介绍GPTCMS是一款开源且免费(基于GPL-3.0协议开源)的ChatGPT聊天管理系统,它基于先进的GPT...
- 高性能计算(HPC)分布式训练:训练框架、混合精度、计算图优化
-
在深度学习模型愈发庞大的今天,分布式训练、高效计算和资源优化已成为AI开发者的必修课。本文将从数据并行vs模型并行、主流训练框架(如PyTorchDDP、DeepSpeed)、混合精度训练(...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 详解DNFSB2毒王的各种改动以及大概的加点框架
- 通篇干货!纵观 PolarDB-X 并行计算框架
- 字节新推理模型逆袭DeepSeek,200B参数战胜671B,豆包史诗级加强
- 阿里智能化研发起飞!RTP-LLM 实现 Cursor AI 1000 token/s 推理技术揭秘
- 多功能高校校园小程序/校园生活娱乐社交管理小程序/校园系统源码
- 婚恋交友系统nuiAPP前端解决上传视频模糊的问题
- 已节省数百万GPU小时!字节再砍MoE训练成本,核心代码全开源
- 通用电气完成XA102发动机详细设计审查 将为第六代战斗机提供动力
- tpxm-19双相钢材质(双相钢f60材质)
- thinkphp6里怎么给layui数据表格输送数据接口
- 标签列表
-
- MVC框架 (46)
- spring框架 (46)
- 框架图 (58)
- bootstrap框架 (43)
- flask框架 (53)
- quartz框架 (51)
- abp框架 (47)
- jpa框架 (47)
- laravel框架 (46)
- express框架 (43)
- springmvc框架 (49)
- 分布式事务框架 (65)
- scrapy框架 (52)
- java框架spring (43)
- grpc框架 (55)
- orm框架有哪些 (43)
- ppt框架 (48)
- 内联框架 (52)
- winform框架 (46)
- gui框架 (44)
- cad怎么画框架 (58)
- ps怎么画框架 (47)
- ssm框架实现登录注册 (49)
- oracle字符串长度 (48)
- oracle提交事务 (47)