Spring Boot 自动配置事务流程的源码级深度分析

下面是对 Spring Boot 自动配置事务流程的源码级深度分析,涵盖自动配置原理、核心组件、事务启动流程、关键注解与类解析,以及 @Transactional 是如何被自动启用的。


🌟 一、Spring Boot 事务管理的本质

Spring Boot 通过 spring-boot-autoconfigure 模块自动配置事务管理器(DataSourceTransactionManager),并启用基于注解的声明式事务支持(@EnableTransactionManagement),实现“开箱即用”的事务能力。


🧩 二、集成方式(零配置)

只需引入:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- 或 MyBatis、JPA 等数据访问模块 -->

无需手动配置事务管理器或启用注解,Spring Boot 会自动完成


🔧 三、自动配置入口:DataSourceTransactionManagerAutoConfiguration

1. 自动配置类加载机制

Spring Boot 2.4+ 使用:

META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports

内容包含:

org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration
org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration

TransactionAutoConfiguration 是事务自动配置的核心。


2. TransactionAutoConfiguration 核心代码

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(PlatformTransactionManager.class)
/**
 * 自动导入:
 * - JtaTransactionManagerConfiguration
 * - TransactionTemplateConfiguration
 */
@AutoConfigureAfter({ JtaAutoConfiguration.class, InfrastructureAutoConfiguration.class })
@EnableTransactionManagement // 启用事务注解支持
public class TransactionAutoConfiguration {
}

📌 它本身不创建 TransactionManager,而是导入其他配置类


3. DataSourceTransactionManagerAutoConfiguration —— 数据源事务自动配置

@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ JdbcTemplate.class, PlatformTransactionManager.class })
@AutoConfigureAfter(DataSourceAutoConfiguration.class)
@EnableConfigurationProperties(DataSourceProperties.class)
public class DataSourceTransactionManagerAutoConfiguration {

    @Configuration(proxyBeanMethods = false)
    @ConditionalOnSingleCandidate(DataSource.class)
    static class DataSourceTransactionManagerConfiguration {

        @Bean
        @ConditionalOnMissingBean(PlatformTransactionManager.class)
        public DataSourceTransactionManager transactionManager(DataSource dataSource) {
            DataSourceTransactionManager txManager = new DataSourceTransactionManager(dataSource);
            // 设置事务超时、是否启用回滚规则等
            return txManager;
        }
    }
}

✅ **自动创建 DataSourceTransactionManager,前提是:

  • 存在 DataSource
  • 没有用户自定义的 PlatformTransactionManager**

🏗️ 四、关键组件与作用

组件作用
@EnableTransactionManagement启用事务注解支持,底层注册 BeanFactoryTransactionAttributeSourceAdvisor
TransactionInterceptor事务拦截器,AOP 切面,拦截 @Transactional 方法
DataSourceTransactionManager事务管理器,负责获取连接、开启/提交/回滚事务
TransactionSynchronizationManager使用 ThreadLocal 管理当前线程的 ConnectionHolderTransactionStatus
PlatformTransactionManager事务管理器接口,DataSourceTransactionManager 是其实现

🚀 五、事务流程源码剖析(@Transactional 执行流程)

sequenceDiagram
    participant Client
    participant UserService
    participant TransactionInterceptor
    participant TransactionManager
    participant TransactionSynchronization
    participant SqlSessionTemplate
    participant Database

    Client ->> UserService: saveUser(user)
    activate UserService

    UserService ->> TransactionInterceptor: 方法调用拦截
    activate TransactionInterceptor

    TransactionInterceptor ->> TransactionManager: getTransaction()
    activate TransactionManager

    TransactionManager ->> TransactionManager: createTransactionIfNecessary()
    TransactionManager ->> DataSource: getConnection()
    activate Database
    Database -->> TransactionManager: 获取 Connection(autoCommit=false)

    TransactionManager ->> TransactionSynchronization: bind Connection to ThreadLocal
    activate TransactionSynchronization
    Note right of TransactionSynchronization: TransactionSynchronizationManager\n绑定 ConnectionHolder

    TransactionManager -->> TransactionInterceptor: 返回 TransactionStatus
    deactivate TransactionManager

    TransactionInterceptor ->> UserService: 执行业务逻辑
    UserService ->> SqlSessionTemplate: userMapper.insert(user)
    SqlSessionTemplate ->> SqlSessionTemplate: getSqlSession() → 复用当前事务的 SqlSession
    SqlSessionTemplate ->> Database: 执行 INSERT
    Database -->> SqlSessionTemplate: 成功

    UserService ->> UserService: 继续其他操作
    UserService ->> TransactionInterceptor: 方法正常结束
    TransactionInterceptor ->> TransactionManager: commit(transactionStatus)
    TransactionManager ->> Database: connection.commit()
    Database -->> TransactionManager: 提交成功

    TransactionManager ->> TransactionSynchronization: 清理 ThreadLocal 资源
    TransactionSynchronization -->> TransactionManager: 资源释放
    deactivate TransactionSynchronization

    TransactionManager -->> TransactionInterceptor: 提交完成
    deactivate TransactionManager

    TransactionInterceptor -->> UserService: 返回结果
    deactivate TransactionInterceptor
    deactivate UserService

    Client -->> Client: 操作成功
    deactivate Database

🧠 六、核心源码机制详解

1. @EnableTransactionManagement 做了什么?

@Import(TransactionManagementConfigurationSelector.class)
public @interface EnableTransactionManagement { }

TransactionManagementConfigurationSelector 导入两个配置类:

  • ProxyTransactionManagementConfiguration:注册 BeanFactoryTransactionAttributeSourceAdvisor(AOP 切面)
  • AspectJTransactionManagementConfiguration:AspectJ 模式(非默认)
ProxyTransactionManagementConfiguration 注册:
@Bean(name = TransactionManagementConfigUtils.TRANSACTION_ADVISOR_BEAN_NAME)
public BeanFactoryTransactionAttributeSourceAdvisor transactionAdvisor() {
    BeanFactoryTransactionAttributeSourceAdvisor advisor = new BeanFactoryTransactionAttributeSourceAdvisor();
    advisor.setTransactionAttributeSource(transactionAttributeSource()); // 解析 @Transactional
    advisor.setAdvice(transactionInterceptor()); // 拦截逻辑
    return advisor;
}

2. TransactionInterceptor 拦截逻辑

public Object invoke(MethodInvocation invocation) throws Throwable {
    Class<?> targetClass = (invocation.getThis() != null ? AopUtils.getTargetClass(invocation.getThis()) : null);
    return invokeWithinTransaction(invocation.getMethod(), targetClass, invocation::proceed);
}

invokeWithinTransaction 中:

  • 调用 transactionManager.getTransaction() 开启事务
  • 执行 proceed()(业务方法)
  • 成功则 commit,异常则 rollback

3. DataSourceTransactionManager.doBegin()

protected void doBegin(Object transaction, TransactionDefinition definition) {
    DataSourceTransactionObject txObject = (DataSourceTransactionObject) transaction;
    Connection con = obtainDataSource().getConnection();
    if (con.getAutoCommit()) {
        txObject.setMustRestoreAutoCommit(true);
        con.setAutoCommit(false); // 关闭自动提交
    }
    txObject.setConnectionHolder(new ConnectionHolder(con));
    TransactionSynchronizationManager.bindResource(getDataSource(), txObject.getConnectionHolder());
}

✅ 关键:将连接绑定到 ThreadLocal,供后续 SQL 操作复用


🧩 七、与 MyBatis 集成时的协同

  • SqlSessionTemplate 检测到当前有事务,会从 TransactionSynchronizationManager 获取 Connection
  • 所有 SqlSession 操作复用同一个 Connection,保证事务一致性。

✅ 八、常见配置(application.yml)

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver

# 事务相关(可选)
transaction:
  default-timeout: 30
  rollback-on-commit-failure: true

🛑 九、常见问题与坑点

问题原因解决方案
@Transactional 不生效方法未被代理(如本类调用)使用 AopContext.currentProxy() 或重构
事务未回滚抛出的是 Exception 而非 RuntimeException设置 @Transactional(rollbackFor = Exception.class)
多数据源事务DataSourceTransactionManager 无法管理多个数据源使用 JtaTransactionManagerdynamic-datasource
事务超时长事务阻塞连接设置 @Transactional(timeout = 30)

✅ 总结:Spring Boot 自动配置事务流程的本质

Spring Boot = 自动配置 + 约定优于配置 + AOP + 事务模板

核心机制说明
TransactionAutoConfiguration自动启用事务支持
DataSourceTransactionManagerAutoConfiguration自动创建事务管理器
@EnableTransactionManagement注册 AOP 切面,拦截 @Transactional
TransactionInterceptor控制事务的开启、提交、回滚
TransactionSynchronizationManager管理事务资源(Connection、SqlSession)的线程绑定
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值