Seata的分布式模型中各个角色的作用:
1.TM(事务管理器)
是分布式事务的发起方,负责定义全局事务的边界(开始,提交,回滚),并于TC交互协调事务状态。
核心职责:
通过@GlobalTransctional注解标记全局事务的起点。
向TC注册全局事务
根据业务逻辑决定全局事务的提交或回滚
2.TC(事务协调器)
是Seata的核心组件,负责协调全局事务的提交或回滚,维护全局事务和分支事务的状态。
核心职责:
接收TM的全局事务注册请求,生成全局唯一的XID。
管理分支事务的注册和状态。
驱动两阶段提交(1.分支事务提交预操作 2.全局提交或回滚)
关键特性:
TC是独立部署的服务,需高可用以保证事务一致性
3.RM(资源管理器)
RM管理本地资源(如数据库、消息队列),负责分支事务的执行和状态报告。
核心职责:
向TC注册分子事务,绑定到全局事务XID。
执行本地事务的提交或回滚操作。
生成并管理undo_log数据,用于事务回滚时的数据恢复。
实现机制:
RM通过JDBC代理拦截SQL,生成前后镜像,记录到updo_log表。
4.undo_log表
用户实现Seata的AT模式,记录事务操作的前后镜像,支持事务回滚时的数据恢复。
工作流程:
1.事务提交前: RM执行SQL时,生成前后镜像并写入undo_log表。
2.事务回滚时:根据undo_log中的before image恢复数据,删除对应的undo_log记录。
3.事务提交后: 异步清理已提交事务的undo_log记录。
1.AT模式
如图展示了AT模式的总体工作流程
1.由TM(事务管理器)开启全局事务至TC中,生成XID
2.将XID传递到RM中所有参与事务的服务
3.:RM向TC注册分支事务,并拦截本地资源操作并于XID关联
4.在RM执行操作前将数据备份至undo_log表中
5.RM执行操作,并向TC提交事务状态
6.由TM提醒TC事务结束
7.由TC检查所有分支的事务状态
8.若所有事务都成功,则删除快照(即删除undo_log表中的数据)
反之则将undo_log表中的数据回滚,将数据变为执行操作前的状态,完成后删除undo_log表中的数据
2.XA模式
RM
一阶段的工作:
- 注册分支事务到
TC
- 执行分支业务sql但不提交
- 报告执行状态到
TC
TC
二阶段的工作:
TC
检测各分支事务执行状态- 如果都成功,通知所有RM提交事务
- 如果有失败,通知所有RM回滚事务
3.TCC模式
TCC模式与AT模式非常相似,每阶段都是独立事务,不同的是TCC通过人工编码来实现数据恢复。需要实现三个方法:
- Try:资源的检测和预留;
- Confirm:完成资源操作业务;要求 Try 成功 Confirm 一定要能成功。
- Cancel:预留资源释放,可以理解为try的反向操作。
4.Saga
- 核心原理:
将长事务拆分为多个本地事务,通过 补偿操作 实现最终一致性。 - 工作流程:
- 按顺序执行多个本地事务。
- 若某个事务失败,依次触发已提交事务的补偿操作。
- 特点:
- 无全局锁:适合长事务(如订单创建后异步通知物流)。
- 异步补偿:通过状态机(State Machine)管理事务和补偿流程。
- 适用场景:跨服务长流程(如订单创建 + 物流调度 + 支付)。
四种模式的对比
XID的解释
在 Seata 中,XID(全局事务 ID) 是分布式事务的唯一标识符,用于在分布式系统中追踪和协调一个全局事务的所有分支事务。
1. XID 的定义
- 核心作用:
XID 是全局事务的唯一标识,贯穿整个分布式事务的生命周期,确保事务的原子性和一致性。 - 生成者:
由 TC(Transaction Coordinator,事务协调器) 在 TM(事务管理器)发起全局事务时生成。
2. XID 的生命周期
全局事务启动:
- TM 调用
@GlobalTransactional
方法时,向 TC 发起“开启全局事务”请求。- TC 生成 XID 并返回给 TM。
分支事务注册:
- 当 RM(资源管理器)执行本地事务时,携带 XID 向 TC 注册分支事务(Branch Transaction)。
事务协调:
- TC 根据 XID 管理所有分支事务的状态(提交或回滚)。
事务结束:
- 全局事务提交或回滚后,TC 清理 XID 关联的所有分支事务信息。