Spring 事务核心:三层结构与失效清单

spring 📚 learning spring-transaction-core · spring · transaction · transactional · transactionmanager · propagation

TL;DR(30 秒扫完)

  • 事务三层结构:@Transactional 注解 + TransactionInterceptor + PlatformTransactionManager
  • 两大前提:数据库支持事务 + 当前对象是 AOP 代理对象
  • 7 种传播机制:REQUIRED / REQUIRES_NEW / SUPPORTS / NOT_SUPPORTED / MANDATORY / NESTED / NEVER
  • 10 条失效清单:注册 Bean / new / 自调用 / 方法可见性 / 非 public / catch 吞异常 / 传播机制 / 数据库引擎 / @Enable / 注解位置

关键结论

结论 A(三层结构)@Transactional 注解 → TransactionInterceptor → PlatformTransactionManager
结论 B(两大前提)数据库支持事务 + 当前对象是 AOP 代理对象
结论 C(异常回滚)默认只对 RuntimeException 回滚,可通过 rollbackFor/noRollbackFor 自定义
结论 D(10 条失效清单)注册 Bean / new / 自调用 / 方法可见性 / 非 public / catch 吞异常 / 传播机制 / 数据库引擎 / @Enable / 注解位置

完整讲解(费曼四步)

STEP 1 · 概念(一句话定义)

  • Spring 事务:基于 AOP 代理的声明式事务管理,通过 @Transactional 注解自动管理事务生命周期
  • PlatformTransactionManager:Spring 事务管理的核心接口,负责事务的开启、提交、回滚
  • 传播机制:定义事务在方法调用链中的传播行为

STEP 2 · 大白话(生活类比)

类比(Spring 事务):就像银行的"转账流程"——你发起转账(开启事务)→ 检查余额(事务内操作)→ 确认转账(提交事务);如果检查余额时发现余额不足(异常),转账会取消(回滚事务)。

STEP 3 · 底层(细节 + 代码/表格)

3.1 事务三层结构

层级组件职责
注解层@Transactional声明事务边界和属性
拦截器层TransactionInterceptorAOP 拦截器,管理事务生命周期
管理器层PlatformTransactionManager事务的核心接口,负责开启/提交/回滚
典型实现类:
  • DataSourceTransactionManager:JDBC 事务管理器
  • JtaTransactionManager:JTA 事务管理器
  • JpaTransactionManager:JPA 事务管理器

3.2 底层 JDBC 操作

// 开启事务
Connection connection = dataSource.getConnection();
connection.setAutoCommit(false);

// 执行事务内操作
// ...

// 提交事务
connection.commit();

// 回滚事务
connection.rollback();

3.3 7 种传播机制

传播机制含义典型场景
REQUIRED有事务则加入,无事务则新建默认值,大多数场景
REQUIRES_NEW总是新建事务,挂起当前事务日志记录、审计
SUPPORTS有事务则加入,无事务则非事务执行查询操作
NOT_SUPPORTED总是非事务执行,挂起当前事务不需要事务的查询
MANDATORY必须在事务中,无事务则抛异常必须在事务中的操作
NESTED有事务则嵌套事务,无事务则新建子事务回滚不影响父事务
NEVER必须无事务,有事务则抛异常不需要事务的操作

3.4 异常回滚规则

默认行为:
  • 只对 RuntimeException 和 Error 回滚
  • 对受检异常(Checked Exception)不回滚
自定义规则:
@Transactional(rollbackFor = Exception.class)  // 所有异常都回滚
@Transactional(noRollbackFor = BusinessException.class)  // 指定异常不回滚
关键坑:异常被 catch 吞掉,事务不会回滚
@Transactional
public void methodA() {
    try {
        methodB();  // 抛异常
    } catch (Exception e) {
        // 吞掉异常,事务不会回滚!
        log.error("异常", e);
    }
}

3.5 10 条失效清单

#失效场景原因规避方案
1Bean 未注册目标类未被 @Component 标注确保目标类被 Spring 管理
2直接 new不走 Spring 容器,没有代理使用 @Autowired 注入
3自调用类内部方法调用不经过代理注入自身代理(@Lazy / @Resource)
4方法 private/final/staticCGLIB 无法继承 final 类,JDK 代理不处理非 public 方法方法改为 public、非 final
5非 public 方法JDK 代理只处理 public 方法方法改为 public
6异常被 catch 吞掉事务拦截器无法感知异常不要吞掉异常,或重新抛出
7传播机制选错如 REQUIRES_NEW 挂起当前事务根据场景选择正确的传播机制
8数据库引擎不支持如 MySQL MyISAM 不支持事务使用 InnoDB 引擎
9@EnableTransactionManagement 未开启Spring 事务管理未启用添加 @EnableTransactionManagement(SpringBoot 默认已开启)
10注解加在字段/构造器@Transactional 只能标注在方法或类上确保注解位置正确

STEP 4 · 简化(比喻/口诀)

事务三层口诀:注解 + 拦截器 + 管理器(3 层结构记 3 个字)。
两大前提口诀:数据库支持 + 代理对象(2 个前提记 2 个字)。
10 条失效口诀:注册、new、自调用、可见性、public、catch、传播、引擎、Enable、位置(10 个字记 10 条)。

速查表

事务三层 · 注解 + 拦截器 + 管理器(@Transactional → TransactionInterceptor → PlatformTransactionManager)
两大前提 · 数据库支持 + 代理对象
7 种传播 · REQUIRED/REQUIRES_NEW/SUPPORTS/NOT_SUPPORTED/MANDATORY/NESTED/NEVER
异常回滚 · 默认只对 RuntimeException 回滚 · rollbackFor/noRollbackFor 自定义 · catch 吞异常不回滚
10 条失效 · 注册/new/自调用/可见性/public/catch/传播/引擎/Enable/位置
常见错点:事务回滚是捕获异常 ❌ / catch 异常不影响事务 ❌ / 事务失效只有 3 种 ❌

Anki 候选卡片

Q: Spring 事务的三层结构是什么?
A: @Transactional 注解 → TransactionInterceptor → PlatformTransactionManager
Q: Spring 事务的两大前提是什么?
A: 数据库支持事务 + 当前对象是 AOP 代理对象
Q: Spring 事务的 7 种传播机制是什么?
A: REQUIRED / REQUIRES_NEW / SUPPORTS / NOT_SUPPORTED / MANDATORY / NESTED / NEVER
Q: Spring 事务默认对哪些异常回滚?
A: 默认只对 RuntimeException 和 Error 回滚
Q: 如何自定义事务回滚规则?
A: @Transactional(rollbackFor = Exception.class) / @Transactional(noRollbackFor = BusinessException.class)
Q: 为什么异常被 catch 吞掉事务不会回滚?
A: 事务拦截器无法感知异常,需要异常向上抛出才能触发回滚
Q: Spring 事务的 10 条失效清单是什么?
A: 注册 Bean / new / 自调用 / 方法可见性 / 非 public / catch 吞异常 / 传播机制 / 数据库引擎 / @Enable / 注解位置
Q: SpringBoot 默认是否开启事务管理?
A: 默认已开启(@EnableTransactionManagement 默认已启用)

关联题目

  • [ ] 《Spring 中 @Transactional 事务的实现原理》—— 2026-09-28 Round 1, 评分 ⭐⭐⭐⭐
  • [ ] 《Spring 事务失效可能是哪些原因?》—— 2026-09-28 Round 1, 评分 ⭐⭐⭐

关联知识

事务三层结构、7 种传播机制、10 条失效清单与规避方案
✦ 记 忆 口 诀 ✦
三层结构三字段 / 两大前提 / 10 条失效清单
关键可视化
暂无可视化
知识关系

⬆️ 前置(Prerequisite)

spring-ioc-corespring-aop-core

🔄 延伸(Extends)

暂无

⚡ 对比(Contrast)

暂无
🎯 概念 📏 规则 ⚠️ 误区 🔍 追问 ✨ 口诀 共 0 张卡,点击翻面