# spring的@Transactional注解深度解析
# 相关问题
- @Transactional的实现原理是什么?
- @Transactional我们应该怎么去深入了解?
- @Transactional注解在怎么情况下会失效?
# 核心模块(必须关注)
# 1. spring-tx(最主要)
这是 @Transactional 注解的实现所在模块
- 包含
org.springframework.transaction.annotation.Transactional - 事务管理器接口
PlatformTransactionManager - 事务定义
TransactionDefinition - 事务状态
TransactionStatus - 事务拦截器
TransactionInterceptor
# 2. spring-aop(第二重要)
事务是基于 AOP 实现的
- 事务通过 AOP 代理机制实现
@Transactional依赖于 AOP 来创建代理对象- 事务拦截器实际是一个 AOP 通知(Advice)
# 3. spring-context(配置和扫描)
负责扫描和注册事务相关组件
- 注解配置驱动(
@EnableTransactionManagement) - 组件扫描器会识别
@Transactional - 应用上下文负责装配事务基础设施
# 具体关注点
# 事务配置相关类:
// 主要配置类
org.springframework.transaction.annotation.EnableTransactionManagement
org.springframework.transaction.annotation.TransactionManagementConfigurationSelector
// 注解定义
org.springframework.transaction.annotation.Transactional
1
2
3
4
5
6
2
3
4
5
6
# 事务处理类:
// 核心拦截器
org.springframework.transaction.interceptor.TransactionInterceptor
// 切点匹配
org.springframework.transaction.interceptor.TransactionAttributeSource
org.springframework.transaction.interceptor.TransactionAttributeSourcePointcut
// 代理创建
org.springframework.transaction.annotation.ProxyTransactionManagementConfiguration
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 事务管理器:
java
// 主要接口
org.springframework.transaction.PlatformTransactionManager
// 具体实现
org.springframework.jdbc.datasource.DataSourceTransactionManager // JDBC
org.springframework.orm.jpa.JpaTransactionManager // JPA
1
2
3
4
5
6
2
3
4
5
6
# 依赖关系图(针对事务)
使用 @Transactional 注解的 Bean
↓
AOP 代理(spring-aop)
↓
TransactionInterceptor(spring-tx)
↓
PlatformTransactionManager(spring-tx)
↓
数据库连接/资源管理
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
# 学习建议
# 1. 源码阅读顺序:
- 先看注解定义:
Transactional.java - 再看配置启用:
EnableTransactionManagement.java - 研究拦截器:
TransactionInterceptor.java - 了解代理创建:
ProxyTransactionManagementConfiguration.java
# 2. 关键机制理解:
- 代理机制:为什么
@Transactional在同类方法调用时不生效 - 事务属性传播:PROPAGATION_REQUIRED, PROPAGATION_REQUIRES_NEW 等
- 事务同步:
TransactionSynchronizationManager - 异常回滚规则:rollbackFor/noRollbackFor
# 3. 调试方法:
// 查看当前事务状态
TransactionSynchronizationManager.getCurrentTransactionName();
TransactionSynchronizationManager.isActualTransactionActive();
TransactionSynchronizationManager.getCurrentTransactionIsolationLevel();
1
2
3
4
2
3
4
# 常见问题关注点
# 失效场景:
- 非 public 方法
- 同类内部调用
- 异常被捕获未抛出
- 多线程环境下
- 数据库引擎不支持(如 MyISAM)
# 配置验证:
// 检查是否启用了事务管理
@Configuration
@EnableTransactionManagement // 必须要有
public class AppConfig {
@Bean
public PlatformTransactionManager transactionManager() {
return new DataSourceTransactionManager(dataSource());
}
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
# 总结
最优先关注:spring-tx 模块,因为:
- 包含了
@Transactional注解本身 - 包含所有事务管理的核心实现
- 事务拦截器、属性源等核心类都在这里
- 是事务功能的"大脑"
次要关注:spring-aop 模块,因为:
- 事务是通过 AOP 代理实现的
- 理解代理机制有助于理解事务行为
辅助关注:spring-context 模块,因为:
- 负责事务相关组件的扫描和装配
建议你先从 spring-tx 源码入手,理解事务的基本流程,然后再研究它与 AOP 的集成机制。