一:概述

   Seata是阿里开源的一个分布式事务解决方案,主要用的是基于二阶段提交思想的AT模式,通过注解实现非业务侵入。在看Seata源码前,首先要做的是理解它的原理。毕竟代码是基于原理具象化,而原理是代码的抽象化!

 

二:原理-二阶段提交

   二阶段提交有三个角色:

   1、TC(Transaction Coordinator),事务协调者,在源码中Seata Server充当事务协调者身份,维护全局锁状态,协调全局事务的提交与回滚。

   2、TM(Transaction Manager),事务管理者,业务代码中使用了全局事务注解的服务属于事务管理者,控制全局事务的范围,执行全局事务的提交与回滚。

   3、RM(Resource Manager),资源管理者,业务代码中被远程调用的部分,负责执行本地事务,和提交与回滚本地事务。

 

 

                                                                             一阶段执行流程

深入理解Seata流程

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回滚成功后然后再释放全局锁。

                                                           所有本地事务执行成功流程

深入理解Seata流程

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

 

                                                          存在本地事务执行失败

深入理解Seata流程

这个阶段,所有的RM执行分支事务回滚,此时是去Undo Log表中查找数据,然后通过第一阶段生成的后置镜像sql,与数据进行校验,通过前置镜像sql做回滚,然后删除Undo Log日志。

 

三:总结

   最后上一张全局的流程图,可以看出来二阶段提交的思想其实还是很简单,下面的文章会对配置文件加载、角色之间RPC通信、RM、TM、TC、全局锁实现,六个主要部分源码进行解析。

深入理解Seata流程

相关文章: