Spring事务
Spring 事务
目录
- 一、前言
- 二、什么是事务?
- 三、Spring 事务的两种实现方式
- 四、Spring 事务底层原理(核心🔥)
- 五、事务失效的常见场景(高频面试🔥)
- 六、事务传播行为(Propagation)🔥🔥🔥
- 七、事务隔离级别(Isolation)
- 八、Spring事务 vs 数据库事务
- 九、核心源码组件(加分项🔥)
- 十、面试标准回答模板(必背🔥)
- 十一、总结
一、前言
在后端开发中,事务是保障数据一致性的核心机制之一。而在 Spring 体系中,事务被高度封装,使开发者可以通过简单的注解完成复杂的事务控制。
本文将从原理 + 实战 + 面试角度,系统梳理 Spring 事务的核心知识点,帮助你达到“能写、能讲、能深入”的面试水平。
二、什么是事务?
事务(Transaction)是数据库中的一组操作集合,具备 ACID 特性:
- A(Atomicity,原子性):要么全部成功,要么全部失败
- C(Consistency,一致性):数据始终处于合法状态
- I(Isolation,隔离性):多个事务互不干扰
- D(Durability,持久性):提交后永久生效
👉 通俗理解:
事务就是一组“要么一起成功,要么一起失败”的操作。
三、Spring 事务的两种实现方式
3.1 编程式事务(了解)
需要通过TransactionTemplate或者TransactionManager手动控制事务:
1 | TransactionStatus status = transactionManager.getTransaction(definition); |
❌ 缺点:
- 代码侵入性强
- 可读性差
- 易出错
3.2 声明式事务(重点🔥)
通过 @Transactional 注解实现:
1 |
|
✅ 优点:
- 无侵入
- 简洁易用
- 与 Spring 深度集成
👉 实际开发和面试的重点。
四、Spring 事务底层原理(核心🔥)
Spring 事务的本质是:
1 | AOP + 代理模式 |
4.1 执行流程
-
调用目标方法
-
进入代理对象(Proxy)
-
开启事务
-
执行业务逻辑
-
判断执行结果:
- 正常执行 → 提交事务(commit)
- 抛出异常 → 回滚事务(rollback)
👉 本质总结:
@Transactional本质是一个 AOP 增强
五、事务失效的常见场景(高频面试🔥)
5.1 方法不是 public
1 |
|
👉 原因:Spring AOP 默认基于代理,只拦截 public 方法
5.2 自调用问题(经典面试题🔥)
1 | public void A() { |
👉 原因:
调用没有经过代理对象,而是 this.B() 直接调用
5.3 异常被捕获
1 | try { |
👉 结果:事务不会回滚 ❗
5.4 非运行时异常不会回滚
默认规则:
- RuntimeException ✅
- Error ✅
- Checked Exception ❌
👉 解决:
1 |
5.5 没有被 Spring 管理
1 | new UserService(); |
👉 必须通过 IoC 容器获取 Bean
六、事务传播行为(Propagation)🔥🔥🔥
用于控制多个事务方法之间的调用关系
| 传播行为 | 说明 |
|---|---|
| REQUIRED(默认) | 有事务就加入,没有就新建 |
| REQUIRES_NEW | 始终新建事务 |
| SUPPORTS | 有事务就用,没有就不用 |
| NOT_SUPPORTED | 不使用事务 |
| MANDATORY | 必须存在事务 |
| NEVER | 必须没有事务 |
| NESTED | 嵌套事务(支持回滚点) |
⭐ 重点对比
REQUIRED
1 | A(事务) |
👉 一起提交 / 一起回滚
REQUIRES_NEW
1 | A(事务) |
👉 B 独立提交,不受 A 影响
七、事务隔离级别(Isolation)
用于解决并发问题:
| 隔离级别 | 解决问题 |
|---|---|
| READ_UNCOMMITTED | 无法避免脏读 ❌ |
| READ_COMMITTED | 避免脏读 |
| REPEATABLE_READ(MySQL默认) | 避免不可重复读 |
| SERIALIZABLE | 最强隔离,性能最差 |
八、Spring事务 vs 数据库事务
| 维度 | Spring事务 | 数据库事务 |
|---|---|---|
| 本质 | 逻辑控制 | 物理实现 |
| 控制方式 | AOP | 数据库引擎 |
| 作用范围 | 方法级 | SQL级 |
👉 本质关系:
1 | Spring事务 = 对数据库事务的封装 |
九、核心源码组件(加分项🔥)
9.1 PlatformTransactionManager
事务管理器接口
常见实现:
- DataSourceTransactionManager(JDBC)
- JpaTransactionManager
9.2 TransactionInterceptor
👉 AOP事务拦截器核心类
9.3 TransactionAttribute
👉 定义事务规则(传播行为、隔离级别等)
十、面试标准回答模板(必背🔥)
1 | Spring事务是基于AOP实现的声明式事务管理机制。 |
十一、总结
Spring 事务的核心可以归纳为三点:
-
本质是 AOP + 代理机制
-
使用方式是 @Transactional 声明式事务
-
难点在于:
- 事务失效场景
- 传播行为
- 隔离级别