详细架构和流程
Seata中的基本概念:
- TC(transaction coordinator) 事务协调者
维护全局和分支事务的状态,驱动全局事务提交或回滚(TM之间的协调者)。 - TM(transaction manager) 事务管理器
定义全局事务的范围:开始全局事务,提交或回滚全局事务。 - RM(transaction manager)资源管理器
管理分支事务处理得的资源,与TC交谈以注册分支事务和报告分支事务的状态,并驱动分支事务提交或回滚。
- TM :业务模块中全局事务的开启者
- 向TC开启一个全局事务
- 调用其他微服务
- RM: 业务模块执行者中,包含RM部分,负责向TC汇报事务执行状态
- 执行本地事务
- 向TC注册分支事务,并提交本地执行结果
- TM:结束对微服务的调用,通知TC,全局事务执行完毕,事务一阶段结束
- TC: 汇报各个分支事务执行结果,决定分布式事务是提交还是回滚
- TC通知所有RM 提交/回滚资源,事务二阶段结束。
一阶段:
- TM开启全局事务,并向TC声明全局事务,包括全局事务XID信息
- TM所在服务调用其他微服务
- 微服务,主要由RM执行
- 查询before_image
- 执行本地事务
- 查询after_image
- 生成undo_log并写入数据库
- 向TC注册分支事务,告知事务执行结果
- 获取全局锁(阻止其他全局事务并发修改当前数据)
- 释放本地锁(不影响其他业务对数据的操作)
- 待所有业务执行完毕,事务发起者(TM)会尝试向TC提交全局事务。
二阶段:
- TC统计分支事务执行情况, 根据结果判断下一步行为
- 分支都成功:通知分支事务,提交事务
- 有分支执行失败:通知执行成功的分支事务,回滚数据
- 分支事务的RM
- 提交事务:直接清空before_image和after_image信息,释放全局锁
- 回滚事务:
- 校验after_image, 判断是否有脏写
- 如果没有脏写, 回滚数据到before_image ,清除before_image和after_image
- 如果有脏写,请求人工介入