Seata分布式事务内核源码深度剖析
Seata是一款开源的分布式事务解决方案,采用"三大角色、两种模式、一个生命周期"架构设计。核心角色包括事务协调者(TC)、事务管理器(TM)和资源管理器(RM),通过AT模式实现二阶段事务处理:一阶段同步执行业务SQL并记录undo_log,二阶段异步提交或回滚补偿。源码结构清晰,包含事务管理器层、代理拦截机制、会话锁管理等模块,通过数据源代理生成undo_log实现事务回滚
一、Seata整体架构与核心角色
Seata(Simple Extensible Autonomous Transaction Architecture)是一款开源的分布式事务解决方案,其核心设计围绕“三大角色、两种模式、一个生命周期”展开。
1.1 三大角色
| 角色 | 简称 | 职责 | 部署方式 |
|---|---|---|---|
| 事务协调者 | TC(Transaction Coordinator) | 维护全局事务与分支事务状态,驱动事务提交/回滚 | 独立部署的服务端 |
| 事务管理器 | TM(Transaction Manager) | 定义全局事务边界:开启、提交、回滚全局事务 | 嵌入应用的客户端 |
| 资源管理器 | RM(Resource Manager) | 管理分支事务资源,注册分支事务、报告状态,执行提交/回滚 | 嵌入应用的客户端 |
1.2 分布式事务生命周期
-
TM向TC申请开启全局事务,TC生成全局唯一的XID。
-
RM向TC注册分支事务,关联XID。
-
TM通知TC提交或回滚全局事务。
-
TC驱动所有RM对分支事务进行提交或回滚。

1.3 AT模式设计思路
一阶段:
-
业务SQL与回滚日志(undo_log)在同一个本地事务中提交。
-
释放本地锁与连接资源,提升并发性能。

二阶段:
-
提交:异步删除undo_log,极速完成。
-
回滚:根据undo_log生成反向SQL,执行数据补偿。

二、Seata核心接口与实现类解析
2.1 事务管理器层
| 类名 | 职责 | 说明 |
|---|---|---|
TransactionManager |
事务管理器接口 | 定义事务生命周期方法 |
DefaultTransactionManager |
默认实现 | 通过SPI机制支持扩展 |
GlobalTransaction |
全局事务接口 | 提供事务开启、提交、回滚等方法 |
DefaultGlobalTransaction |
默认实现 | 持有TransactionManager,支持事务嵌套与角色控制 |
2.2 代理与拦截机制
| 组件 | 作用 |
|---|---|
GlobalTransactionScanner |
Spring Bean后处理器,对@GlobalTransactional或@GlobalLock注解的方法进行AOP代理 |
GlobalTransactionalInterceptor |
方法拦截器,实现事务启停、提交回滚逻辑 |
TransactionalTemplate |
模板类,封装“开启事务→执行业务→提交/回滚”流程 |
2.3 事务协调器(TC)核心
| 类名 | 职责 |
|---|---|
DefaultCoordinator |
TC默认实现,接收TM/RM的RPC请求 |
Core |
TC核心处理器,处理RM/TM的各类事务请求 |
ATCore |
AT模式核心处理器,负责分支注册、状态报告、锁查询等 |
2.4 会话与锁管理
| 组件 | 说明 |
|---|---|
GlobalSession |
全局会话,对应一个全局事务,管理多个BranchSession |
BranchSession |
分支会话,对应一个分支事务,持有锁信息 |
LockManager |
锁管理器,将lockKey转为行锁列表,委托Locker处理 |
Locker |
锁接口,提供加锁、释放、查询等方法 |
2.5 资源管理器(RM)层
| 类名 | 职责 |
|---|---|
ResourceManager |
资源管理器接口 |
DefaultResourceManager |
默认实现,委派给具体ResourceManager |
DataSourceManager |
AT模式核心管理器,负责资源注册、提交、回滚等 |
2.6 数据源代理与Undo日志
| 组件 | 作用 |
|---|---|
DataSourceProxy |
数据源代理,拦截SQL生成undo_log |
UndoLogManager |
Undo日志管理器,负责写入、删除、查询undo_log |
SQLRecognizer |
SQL识别器,解析SQL类型、表名、别名等 |
UndoExecutorFactory |
根据SQL类型生成对应的Undo执行器,实现反向补偿 |
三、Seata AT模式源码执行流程详解
3.1 一阶段:本地事务提交与Undo日志记录
java
// 伪代码示例:一阶段执行
try {
// 1. 注册分支事务
register();
// 2. 写入undo_log
UndoLogManagerFactory.getUndoLogManager(dbType).flushUndoLogs(this);
// 3. 提交本地事务
targetConnection.commit();
} catch (Throwable ex) {
// 异常处理与报告
report(false);
throw new SQLException(ex);
}
3.2 二阶段:异步提交或回滚补偿
-
提交成功:TC通知RM异步删除undo_log
-
回滚请求:RM根据XID与BranchID查找undo_log,生成反向SQL执行补偿
3.3 关键流程示意图


-
TM发起全局事务 → TC创建GlobalSession
-
RM执行本地事务 → 注册分支 + 写入undo_log
-
TM通知TC提交/回滚
-
TC驱动RM执行最终操作
四、总结与展望
Seata通过清晰的角色分离、二阶段异步化设计、基于undo_log的补偿机制,实现了高性能、高可用的分布式事务解决方案。其源码结构清晰、模块分明,是学习分布式事务设计与实现的优秀范本。

更多推荐

所有评论(0)