前言
- Seata为阿里开源的分布式事务解决方案,使用很简单,只需要添加
@GlobalTransactional
注解就可以了,本篇文章主要记录一下Seata AT的工作流程;
工作流程
涉及三个角色:
-
TC (Transaction Coordinator) - 事务协调者
维护全局和分支事务的状态,驱动全局事务提交或回滚; -
TM (Transaction Manager) - 事务管理器
定义全局事务的范围:开始全局事务、提交或回滚全局事务,也就是事务的发起方; -
RM (Resource Manager) - 资源管理器
管理分支事务处理的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚;
整体机制
- 一阶段
- 业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源;
- 二阶段
- 提交异步化,非常快速地完成;
- 回滚通过一阶段的回滚日志进行反向补偿;
一阶段
- Seata会拦截业务
SQL
- 通过SQL,获取到需要更新的数据,保存为
前镜像
; - 执行SQL,通过执行后的结果数据,保存为
后镜像
; - 根据SQL范围,生成锁;
- 插入回滚日志,把前后镜像数据以及业务SQL相关信息组成回滚日志,插入到
UNDO_LOG
表中; - 提交前,向TC申请全局锁;
- 业务数据提交,以及插入回滚日志表;
- 将本地事务结果上报到TC;
二阶段-提交
- 如果收到了TC的提交请求,那么将返回提交成功的结果给TC;
- 因为在一阶段已经提交事务到数据库,在这里只要对应的
UNDO LOG
记录删除并释放掉锁就可以;
二阶段-回滚
- 如果二阶段是回滚的话,那么会通过
XID
和Branch ID
查找到对应的UNDO LOG
记录; - 用
UNDO LOG
中的后镜像与当前数据进行比较,如果相同,则执行回滚操作; - 如果不同,那么说数据被其他事务做了修改,这种情况下,需要根据配置策略来做其他处理;