2022-10-27 515
对于分布式事务的概念,可能还有很多朋友不理解或者理解得不是很深刻,本文将带大家一文吃透“分布式事务”。
图片来自 Pexels
本地事务
事务 Transaction 由一组 SQL 组成,具有四个 ACID 特性:
事务实现
对于 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 理论:
如何解决
场景举例
考虑这样一种业务场景,系统 A 调用系统 B 的退款服务进行退款,系统 A 更改内部退款状态,接着调用系统 C 的短信服务通知用户。
在这样的一个场景下,由于网络不可靠的必然存在,存在 A、B、C 三个系统之间一致性的问题。
本地表
针对上述场景,设计两张表:退款记录表和短信发送记录表以及相应的补偿 Job。
具体实现过程:
退款补偿 Job,查询退款记录表中处理中的记录,调用系统 B 的退款服务,退款成功处理:
短信通知补偿 Job,查询短信发送记录中待发送的记录,调用系统 C 的短信服务:
注意:
事务消息
可以将其视为两阶段提交消息实现,以确保分布式系统中的最终一致性。事务性消息可确保本地事务的执行和消息的发送可以原子方式执行。
但是由于事务消息异步的特性,调用方拿不到消费方的处理结果,适用于不关心对方的返回结果/对方负责保证处理成功。
针对上述场景,增加两个事务消息的方式解决一致性问题,系统 A 通过发送事务消息的方式与系统 B 和系统 C 进行交互。
具体实现过程:
提供 MQ 事务 callback:
退款同步 Job,查询退款记录表中处理中的记录,调用系统 B 的退款查询接口同步状态,其中退款成功处理:
相关理论
二阶段提交
二阶段提交是解决分布式事务问题的重要理论基础,但也存在着明显的问题:
为了解决二阶段提交出现的问题,又有了三阶段提交(Three-phase commit):
DTP Model
X/Open 分布式事务处理 DTP(Distributed Transaction Processing)模型是一种软件体系架构,已经成为事实上的事务模型组件的行为标准。
它允许多个应用程序共享由多个资源管理器提供的资源,并允许其工作被协调为全局事务:
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 的服务端独立部署:
在 Seata 中,分布式事务的执行流程:
①AT 模式
AT 模式是一种无侵入的分布式事务解决方案。
在 AT 模式下,用户只需关注自己的“业务 SQL”,用户的 “业务 SQL” 作为一阶段,Seata 框架会自动生成事务的二阶段提交和回滚操作。
在一阶段,Seata 会拦截“业务 SQL”,首先解析 SQL 语义,找到“业务 SQL”要更新的业务数据,在业务数据被更新前,将其保存成“before image”,然后执行“业务 SQL”更新业务数据,在业务数据更新之后,再将其保存成“after image”,最后生成行锁。
以上操作全部在一个数据库事务内完成,这样保证了一阶段操作的原子性。
②TCC 模式
一个分布式的全局事务,整体是两阶段提交的模型。全局事务是由若干分支事务组成的,分支事务要满足两阶段提交的模型要求,即需要每个分支事务都具备自己的:
TCC 模式,不依赖于底层数据资源的事务支持:
所谓 TCC 模式,是指支持把 自定义 的分支事务纳入到全局事务的管理中。
③Saga 模式
目前 Seata 提供的 Saga 模式是基于状态机引擎来实现的,机制是:
状态机引擎原理:
原文链接:https://77isp.com/post/10597.html
=========================================
https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态