一:概述
Seata是阿里开源的一个分布式事务解决方案,主要用的是基于二阶段提交思想的AT模式,通过注解实现非业务侵入。在看Seata源码前,首先要做的是理解它的原理。毕竟代码是基于原理具象化,而原理是代码的抽象化!
二:原理-二阶段提交
二阶段提交有三个角色:
1、TC(Transaction Coordinator),事务协调者,在源码中Seata Server充当事务协调者身份,维护全局锁状态,协调全局事务的提交与回滚。
2、TM(Transaction Manager),事务管理者,业务代码中使用了全局事务注解的服务属于事务管理者,控制全局事务的范围,执行全局事务的提交与回滚。
3、RM(Resource Manager),资源管理者,业务代码中被远程调用的部分,负责执行本地事务,和提交与回滚本地事务。
一阶段执行流程

1、第一阶段如上图所有的RM执行自己的本地事务。在执行本地事务时,用大白话讲其实就是jdbc执行sql时,seata使用了数据源代理,在执行sql前,对sql进行解析,生成前置镜像sql,后置镜像sql,同时向undo log插入一条数据,方便后期万一出现异常做回滚,然后向TC注册分支事务,提交本地事务,最后向TC提交它的分支事务状态。
二阶段,二阶段分两种情况。
1、所有RM本地事务执行成功,此时TM会向TC发起全局事务提交,TC会立马释放全局锁然后异步驱动所有RM做分支事务的提交。
2、存在一个RM本地事务不成功,此时TM会向TC发起全局事务回滚,TC会驱动所有的RM做回滚操作,等待所有的RM回滚成功后然后再释放全局锁。
所有本地事务执行成功流程

这个阶段所有RM提交分支事务,其实就是删除Undo Log表里的记录,如果提交分支事务失败,并不会影响业务数据,可以手动的做Undo Log删除。
存在本地事务执行失败

这个阶段,所有的RM执行分支事务回滚,此时是去Undo Log表中查找数据,然后通过第一阶段生成的后置镜像sql,与数据进行校验,通过前置镜像sql做回滚,然后删除Undo Log日志。
三:总结
最后上一张全局的流程图,可以看出来二阶段提交的思想其实还是很简单,下面的文章会对配置文件加载、角色之间RPC通信、RM、TM、TC、全局锁实现,六个主要部分源码进行解析。

本文深入探讨Seata,一个阿里开源的分布式事务解决方案,采用基于二阶段提交的AT模式。文章介绍了Seata的角色:TC、TM和RM,详细阐述了一阶段和二阶段提交的过程,包括事务的成功和失败情况。最后,总结了全局流程,并预告后续将解析源码。
235

被折叠的 条评论
为什么被折叠?



