跳至主要內容

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 注解的方法。
  • 底层操作
    1. 通过 TransactionManager 获取数据库连接(对应图中“连接池获取”)。
    2. 根据事务属性设置隔离级别、超时时间(对应“还款条件”)。

Step 2: 业务逻辑执行

  • 流程图中“还款任务”执行:执行 SQL 操作(如转账、扣款)。
  • 事务同步:通过 TransactionSynchronizationManager 绑定资源(如数据库连接)到当前线程。

Step 3: 事务提交/回滚

  • 决策点(对应流程图菱形判断框)
    • 无异常 → 提交事务(commit),释放连接(对应“还款任务完成”)。
    • 有异常 → 回滚事务(rollback),数据回退(对应“还款任务失败”)。
  • 回滚规则:默认只回滚 RuntimeExceptionError,可通过 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.proceedTransactionInterceptor.invoke()
“还款条件”注释事务属性(传播行为、隔离级别)TransactionDefinition
“还款任务失败”箭头回滚事务流程AbstractPlatformTransactionManager.rollback()
“连接池获取”数据源连接管理DataSourceUtils.getConnection()

5. 设计启示(如何参考此图设计事务系统)

  1. 明确事务边界:通过 AOP 或注解定义事务范围(避免“还款任务不能退开”问题)。
  2. 分层解耦
    • 业务层:只关注逻辑(如“还款责任”)。
    • 事务管理层:处理连接、提交/回滚(如“财务部为还款方付款”)。
  3. 异常处理策略:自定义 RollbackRuleAttribute 实现精细化控制。
  4. 性能优化:合理设置超时时间、连接池大小(避免“还款任务期限”超限)。

6. Spring 事务源码关键入口

  1. 事务代理生成ProxyTransactionManagementConfiguration → 创建 AOP 代理。
  2. 事务属性解析AnnotationTransactionAttributeSource → 解析 @Transactional
  3. 事务管理器调度TransactionAspectSupport.invokeWithinTransaction → 统一入口。

通过此流程图,可以清晰看到 Spring 事务将业务逻辑(还款任务)与事务控制(提交/回滚)解耦,通过分层设计和 AOP 动态代理实现高内聚低耦合。实际开发中,需结合业务场景选择合适的传播行为和隔离级别,确保数据一致性。