Spring事务 核心知识

Spring 事务核心知识 总结,覆盖原理、机制、常考点、易踩坑


一、什么是 Spring 事务(本质)

Spring 事务是 对数据库事务的统一抽象与管理机制,核心目标:

保证一组数据库操作要么全部成功,要么全部失败(ACID)

Spring 并不直接实现事务,而是 基于底层事务实现(JDBC / JTA)进行封装

核心抽象接口:
Spring FrameworkPlatformTransactionManager


二、Spring 事务的两种使用方式(必考)

1. 编程式事务(了解即可)

java 复制代码
TransactionStatus status = transactionManager.getTransaction(definition);
try {
    // 业务逻辑
    transactionManager.commit(status);
} catch (Exception e) {
    transactionManager.rollback(status);
}

特点:

  • 灵活
  • 侵入性强
  • 实际项目很少用

2. 声明式事务(重点 + 面试主流)

java 复制代码
@Transactional
public void createOrder() {
    // 业务代码
}

本质:

  • AOP + 代理

  • 在方法前后自动:

    • 开启事务
    • 提交 / 回滚事务

常用注解:

  • @Transactional

三、Spring 事务的底层原理(高频面试)

核心链路(一定要能说清)

复制代码
@Transactional
   ↓
Spring AOP(代理对象)
   ↓
TransactionInterceptor
   ↓
PlatformTransactionManager
   ↓
JDBC / JPA / MyBatis

关键点

  • 通过 AOP 在方法调用前后增强
  • 事务对象绑定到 当前线程(ThreadLocal)
  • 同一线程中共享同一个数据库连接

面试回答模板:

Spring 事务是基于 AOP 实现的,@Transactional 会生成代理对象,在方法执行前通过 PlatformTransactionManager 开启事务,方法正常结束提交事务,出现异常时根据回滚规则进行回滚。


四、事务四大特性(ACID)------基础必答

特性 含义
原子性(Atomicity) 操作要么全成功要么全失败
一致性(Consistency) 事务前后数据状态合法
隔离性(Isolation) 并发事务互不干扰
持久性(Durability) 提交后数据永久保存

五、事务传播行为(Propagation)

面试最容易被追问的一块

常见传播行为(记住这 5 个)

行为 含义 使用场景
REQUIRED(默认) 有事务就加入,没有就新建 90% 场景
REQUIRES_NEW 总是新建事务 日志、审计
SUPPORTS 有就用,没有不用 查询
NOT_SUPPORTED 挂起当前事务 非事务逻辑
NESTED 嵌套事务(保存点) 局部回滚

高频追问:

  • REQUIRED vs REQUIRES_NEW 区别
  • 内层异常是否影响外层事务

六、事务隔离级别(并发必考)

Spring 直接使用数据库隔离级别:

隔离级别 解决问题
READ_UNCOMMITTED 可能脏读
READ_COMMITTED(Oracle 默认) 防止脏读
REPEATABLE_READ(MySQL 默认) 防止不可重复读
SERIALIZABLE 串行,性能最低

面试重点:

  • MySQL 默认隔离级别?
  • 幻读如何解决?

七、回滚规则(非常容易踩坑)

1. 默认回滚规则(必背)

只回滚 RuntimeException 和 Error

❌ 不会回滚:

java 复制代码
throw new Exception();

2. 指定回滚规则

java 复制代码
@Transactional(rollbackFor = Exception.class)

面试追问:

为什么 Spring 默认不回滚 checked exception?

标准回答:

因为 checked exception 通常代表可预期的业务异常,而不是系统错误。


八、Spring 事务失效的 8 大原因(面试杀手锏)

常见失效场景

  1. 方法不是 public
java 复制代码
@Transactional
private void test() {} 
  1. 同类方法内部调用
java 复制代码
this.methodA(); //不走代理
  1. 异常被 try-catch 吃掉
java 复制代码
try {
   ...
} catch (Exception e) {
   // 没抛出
}
  1. 抛出 checked exception
java 复制代码
throw new Exception(); // 默认不回滚
  1. 数据库引擎不支持事务(MyISAM)

  2. 没有被 Spring 管理(new 出来的对象)

  3. @Transactional 加在接口方法上(JDK 代理问题)

  4. 传播行为设置不当(REQUIRES_NEW)

面试建议:

至少能说出 3--5 个事务失效原因


九、@Transactional 的常用属性(面试可加分)

java 复制代码
@Transactional(
    propagation = Propagation.REQUIRED,
    isolation = Isolation.READ_COMMITTED,
    rollbackFor = Exception.class,
    timeout = 30,
    readOnly = true
)

十、一句话面试总结(背下来)

Spring 事务本质是基于 AOP 的声明式事务管理,通过 PlatformTransactionManager 统一控制事务的开启、提交和回滚,事务基于线程绑定数据库连接,常见问题集中在传播行为、回滚规则以及代理失效场景。


相关推荐
二十雨辰4 小时前
[Java]RuoYi框架原理分析
java
东离与糖宝4 小时前
Java 玩转 AI 智能体性能优化:OpenClaw 高并发调用与 Token 成本控制实战
java·人工智能
y = xⁿ5 小时前
【从零开始学习Redis|第七篇】Redis 进阶原理篇:消息队列、分布式锁、缓存击穿与事务实现
java·redis·学习·缓存
beata5 小时前
Spring Boot基础-2:Spring Boot 3.x 起步依赖(Starter)深度拆解:为什么引入一个依赖就够了?
spring boot·后端
享棣5 小时前
Win11 安装 Nacos 2.0.4 完整版文档 文档说明
后端
90后的晨仔5 小时前
windows安装 openclaw 报错
后端
AMoon丶5 小时前
Golang--多种数据结构详解
linux·c语言·开发语言·数据结构·c++·后端·golang
深蓝轨迹5 小时前
SpringBoot YAML配置文件全解析:语法+读取+高级用法
java·spring boot·后端·学习
颜酱5 小时前
最小生成树(MST)核心原理 + Kruskal & Prim 算法
javascript·后端·算法
深蓝轨迹5 小时前
乐观锁 vs 悲观锁 含面试模板
java·spring boot·笔记·后端·学习·mysql·面试