# spring的@Transactional注解深度解析

# 相关问题

  1. @Transactional的实现原理是什么?
  2. @Transactional我们应该怎么去深入了解?
  3. @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

# 事务处理类

// 核心拦截器
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

# 事务管理器

java

// 主要接口
org.springframework.transaction.PlatformTransactionManager

// 具体实现
org.springframework.jdbc.datasource.DataSourceTransactionManager  // JDBC
org.springframework.orm.jpa.JpaTransactionManager                // JPA
1
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

# 学习建议

# 1. 源码阅读顺序

  1. 先看注解定义Transactional.java
  2. 再看配置启用EnableTransactionManagement.java
  3. 研究拦截器TransactionInterceptor.java
  4. 了解代理创建ProxyTransactionManagementConfiguration.java

# 2. 关键机制理解

  • 代理机制:为什么 @Transactional 在同类方法调用时不生效
  • 事务属性传播:PROPAGATION_REQUIRED, PROPAGATION_REQUIRES_NEW 等
  • 事务同步TransactionSynchronizationManager
  • 异常回滚规则:rollbackFor/noRollbackFor

# 3. 调试方法

// 查看当前事务状态
TransactionSynchronizationManager.getCurrentTransactionName();
TransactionSynchronizationManager.isActualTransactionActive();
TransactionSynchronizationManager.getCurrentTransactionIsolationLevel();
1
2
3
4

# 常见问题关注点

# 失效场景

  1. 非 public 方法
  2. 同类内部调用
  3. 异常被捕获未抛出
  4. 多线程环境下
  5. 数据库引擎不支持(如 MyISAM)

# 配置验证

// 检查是否启用了事务管理
@Configuration
@EnableTransactionManagement  // 必须要有
public class AppConfig {
    
    @Bean
    public PlatformTransactionManager transactionManager() {
        return new DataSourceTransactionManager(dataSource());
    }
}
1
2
3
4
5
6
7
8
9
10

# 总结

最优先关注:spring-tx 模块,因为:

  1. 包含了 @Transactional 注解本身
  2. 包含所有事务管理的核心实现
  3. 事务拦截器、属性源等核心类都在这里
  4. 是事务功能的"大脑"

次要关注:spring-aop 模块,因为:

  1. 事务是通过 AOP 代理实现的
  2. 理解代理机制有助于理解事务行为

辅助关注:spring-context 模块,因为:

  1. 负责事务相关组件的扫描和装配

建议你先从 spring-tx 源码入手,理解事务的基本流程,然后再研究它与 AOP 的集成机制。

Last Updated: 12/4/2025, 10:23:47 AM