Spring 源码学习-掌握事务实现
大约 4 分钟
根据提供的流程图信息,结合 Spring 事务的核心设计逻辑,我将通过分层解析和关键流程推演,为你梳理 Spring 事务的设计思路,并将图中提到的“还款任务”“决策点”等元素与源码实现对应。
1. 核心设计分层(对应流程图颜色区块)
Layer 1: 事务定义与配置
@Transactional
** 注解**:定义事务属性(传播行为、隔离级别、超时、只读等)。TransactionDefinition
** 接口**:规范事务属性(对应图中“还款条件”)。- 示例代码:
@Transactional(
propagation = Propagation.REQUIRED,
isolation = Isolation.DEFAULT,
timeout = 30
)
public void transfer() { ... }
Layer 2: 事务管理器
PlatformTransactionManager
:核心接口,实现类如DataSourceTransactionManager
(JDBC)、JpaTransactionManager
(JPA)。- 职责:
- 获取事务状态(
getTransaction
)。 - 提交或回滚事务(对应图中“还款任务”的执行结果判断)。
- 获取事务状态(
- 源码关键逻辑:
public interface PlatformTransactionManager {
TransactionStatus getTransaction(TransactionDefinition definition);
void commit(TransactionStatus status);
void rollback(TransactionStatus status);
}
Layer 3: 事务拦截器
TransactionInterceptor
:通过 AOP 拦截目标方法,管理事务边界。- 流程图中的“决策点”:判断是否抛出异常 → 触发回滚(对应
rollbackOn
方法)。 - 核心流程:
public Object invoke(MethodInvocation invocation) {
// 开启事务
TransactionStatus status = tm.getTransaction(txAttr);
try {
Object result = invocation.proceed(); // 执行业务方法
tm.commit(status); // 提交(对应“还款成功”)
return result;
} catch (Exception ex) {
if (txAttr.rollbackOn(ex)) {
tm.rollback(status); // 回滚(对应“还款任务失败”)
}
throw ex;
}
}
2. 关键流程推演(对照流程图箭头方向)
Step 1: 事务开启
- 触发条件:调用被
@Transactional
注解的方法。 - 底层操作:
- 通过
TransactionManager
获取数据库连接(对应图中“连接池获取”)。 - 根据事务属性设置隔离级别、超时时间(对应“还款条件”)。
- 通过
Step 2: 业务逻辑执行
- 流程图中“还款任务”执行:执行 SQL 操作(如转账、扣款)。
- 事务同步:通过
TransactionSynchronizationManager
绑定资源(如数据库连接)到当前线程。
Step 3: 事务提交/回滚
- 决策点(对应流程图菱形判断框):
- 无异常 → 提交事务(
commit
),释放连接(对应“还款任务完成”)。 - 有异常 → 回滚事务(
rollback
),数据回退(对应“还款任务失败”)。
- 无异常 → 提交事务(
- 回滚规则:默认只回滚
RuntimeException
和Error
,可通过rollbackFor
自定义。
3. 流程图中的特殊场景解析
场景 1: 嵌套事务(对应“还款任务方清还款方”)
- **传播行为 **
PROPAGATION_NESTED
:嵌套事务使用保存点(Savepoint),子事务回滚不影响父事务。 - 代码示例:
@Transactional(propagation = Propagation.REQUIRED)
public void parentMethod() {
// 父事务逻辑
childMethod();
}
@Transactional(propagation = Propagation.NESTED)
public void childMethod() { ... }
场景 2: 事务超时(对应“还款任务期限”)
- 超时机制:若事务未在指定时间内完成,强制回滚(防止长时间占用连接)。
- 配置方式:
@Transactional(timeout = 30)
。
场景 3: 多数据源事务(对应“支付:资贷中心”)
ChainedTransactionManager
:管理多个数据源的事务(需引入 Spring Data JPA 或 Atomikos)。- 风险点:非 XA 协议下无法保证强一致性(最终一致性需业务补偿)。
4. 与流程图元素的映射关系
流程图元素 | Spring 事务设计对应点 | 源码类/方法 |
---|---|---|
决策点(菱形框) | 判断是否回滚的 rollbackOn 逻辑 | RuleBasedTransactionAttribute |
“还款任务”流程框 | 业务方法执行(MethodInvocation.proceed ) | TransactionInterceptor.invoke() |
“还款条件”注释 | 事务属性(传播行为、隔离级别) | TransactionDefinition |
“还款任务失败”箭头 | 回滚事务流程 | AbstractPlatformTransactionManager.rollback() |
“连接池获取” | 数据源连接管理 | DataSourceUtils.getConnection() |
5. 设计启示(如何参考此图设计事务系统)
- 明确事务边界:通过 AOP 或注解定义事务范围(避免“还款任务不能退开”问题)。
- 分层解耦:
- 业务层:只关注逻辑(如“还款责任”)。
- 事务管理层:处理连接、提交/回滚(如“财务部为还款方付款”)。
- 异常处理策略:自定义
RollbackRuleAttribute
实现精细化控制。 - 性能优化:合理设置超时时间、连接池大小(避免“还款任务期限”超限)。
6. Spring 事务源码关键入口
- 事务代理生成:
ProxyTransactionManagementConfiguration
→ 创建 AOP 代理。 - 事务属性解析:
AnnotationTransactionAttributeSource
→ 解析@Transactional
。 - 事务管理器调度:
TransactionAspectSupport.invokeWithinTransaction
→ 统一入口。
通过此流程图,可以清晰看到 Spring 事务将业务逻辑(还款任务)与事务控制(提交/回滚)解耦,通过分层设计和 AOP 动态代理实现高内聚低耦合。实际开发中,需结合业务场景选择合适的传播行为和隔离级别,确保数据一致性。