下面是对 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 管理当前线程的 ConnectionHolder 和 TransactionStatus |
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 无法管理多个数据源 | 使用 JtaTransactionManager 或 dynamic-datasource |
| 事务超时 | 长事务阻塞连接 | 设置 @Transactional(timeout = 30) |
✅ 总结:Spring Boot 自动配置事务流程的本质
Spring Boot = 自动配置 + 约定优于配置 + AOP + 事务模板
| 核心机制 | 说明 |
|---|---|
TransactionAutoConfiguration | 自动启用事务支持 |
DataSourceTransactionManagerAutoConfiguration | 自动创建事务管理器 |
@EnableTransactionManagement | 注册 AOP 切面,拦截 @Transactional |
TransactionInterceptor | 控制事务的开启、提交、回滚 |
TransactionSynchronizationManager | 管理事务资源(Connection、SqlSession)的线程绑定 |

被折叠的 条评论
为什么被折叠?



