分布式事务从理论到具体实现囊括的知识点很多,一篇文章塞满所有知识点是不可能的,本篇只包含分布式事务相关的主要理论及知识点,抛砖引玉。
分布式事务是什么
微服务架构下,一般一个微服务对应一个数据库(单服务多数据源,如果需要保证数据强一致性,可以使用中间件Atomikos),普通的数据库事务是针对单库下的多条sql同时保证执行成功或失败,而分布式事务是针对多库下的分支事务同时保证执行成功或失败。也就是分布式事务是保证系统中多个相关联的数据库的数据一致性。
分布式事务相关术语
事务的基本特性
ACID:A-原子性(Atomicity),即一个事务内的所有操作统一执行成功或失败;C-一致性(Consistency),即数据一致性;I-隔离性(Isolation),即并发事务下的互不干扰;D-持久性(Durability),即事务操作后的结果持久化。
分布式事务的理论基础
CAP:这是分布式事务的理论基础,C-一致性(Consistence),即数据一致性;A-可用性(Availability),即服务可用;P-分区容错性(Partition tolerance),即当服务访问出现问题时,保证系统整体使用正常。当系统分区的情况下,一般要求保证系统满足CP或AP;CP模型强调的是系统的一致性,在做系统设计时,需要优先考虑一致性;AP模型强调的是系统的可用性,在做系统设计时,需要优先考虑可用性。
BASE:这也是分布式事务的理论基础,在系统无法保证强一致性的情况下,可以根据此理论设计系统。BA- Basically Available(基本可用),即当系统发生故障时,允许损失部分可用性,保证核心可用;S-Soft state(软状态),即允许系统中的数据存在中间状态,并认为该中间状态的存在不会影响系统的整体可用性,比如允许数据副本同步的过程存在延时;E-Eventually Consistent(最终一致性),即系统中的所有数据副本经过一定时间后,最终能够达到一致的状态。
事务一致性的3个级别
强一致性:要求写入数据后,下一次读取一定就是最新数据。
弱一致性:不能保证什么时候能读取到最新的值,只能保证某个时刻能达到数据一致。
最终一致性:弱一致性的升级版,系统保证在一定时间内达到数据一致。
事务对象
TC:事务协调者(Transaction Coordinator),维护全局和分支事务的状态,驱动全局事务提交或回滚。
TM:事务管理器(Transaction Manager),定义全局事务的范围:开始全局事务、提交或回滚全局事务。
RM:资源管理器(Resource Manager),管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
事务解决方案
2PC:二阶段提交协议(Two Phase Commitment Protocol),2PC将事务的提交过程分为准备阶段和提交阶段。
- 准备阶段-查看RM是否能执行事务,可以则写redo/undo log,但不提交事务并返回成功;
- 提交阶段-如果有RM在准备阶段返回失败,则所有RM回滚,否则所有分支事务正式提交完成。
3PC:三阶段提交协议(Three Phase Commitment Protocol),3PC将事务的提交过程分为准备阶段(CanCommit)、预提交阶段(PreCommit)和提交阶段(doCommit)。
- 准备阶段-查看RM是否能执行事务;
- 预提交阶段-TM发送预提交请求给RM,任一RM反馈无法执行或超时,则中断所有RM事务,等规定时间内没有收到TM的中断命令,则写redo/undo log;
- 提交阶段-TM向RM发送提交事务请求,RM提交成功并返回完成,如果任一RM返回失败或超时,TM则发送中断请求,所有RM回滚。
事务模式
XA:XA是 X/Open 组织定义的分布式事务处理(DTP,Distributed Transaction Processing)标准。XA规范描述了全局的事务管理器与局部的资源管理器之间的接口,2PC和3PC都是基于XA规范衍生的分布式事务处理方案。XA规范需要数据库支持才能使用,比如mysql,分布式事务的回滚依靠分支事务的undo log。
AT:AT好像目前只有Seata中间件实现了,他模仿XA并作了一些改进,也不再依靠数据库去适配它,主要实现方式还是2PC。AT会自建一张UNDO_LOG Table,发生事务时,会自己解析sql,生成前、后镜像,组装后存入UNDO_LOG Table,等回滚时使用。AT还设计了全局锁,只有拿到全局锁才能提交本地事务。
TCC:TCC是通过侵入业务代码实现分布式事务的,T-尝试阶段(Try),资源检测和预留;C-确认阶段(Confirm),完成资源操作业务;C-取消阶段(Cancel),预留资源的释放。通过手动编写三个阶段的代码逻辑自定义实现分布式事务,不需要使用数据库事务,所以性能也好,TCC相当于一个设计模式。
Saga:特点是能将一个长事务拆分为多个短事务,短事务T1 ~ Tn,每个短事务对应一个补偿动作Cn。逐一执行短事务Ti,当Ti执行失败,有2种恢复方式,正向恢复-即重试Ti,反向恢复-执行C0 ~ Ci的补偿动作,逆向Tn短事务。
分布式事务中间件
常见的中间件有以下这些,不一一介绍了,去github和官网看看吧。
Atomikos:Atomikos - cloud-native transaction management for Java and REST
Seata:Seata 官网
Hmily:Dromara Hmily 官网
参考链接
Seata官网文档
CAP和BASE理论介绍
分布式事务之2PC和3PC_xiaomisolo的博客-CSDN博客
分布式事务XA、AT、TCC、SAGA - 腾讯云开发者社区
搞懂Seata分布式事务AT、TCC、SAGA、XA模式选型_知识浅谈的博客-CSDN博客