Spring事务传播行为、隔离级别

2025年Java面试宝典最新版已更新!
链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g 提取码: 9b3g
一、为什么面试官总爱问事务问题?
Spring事务的传播行为和隔离级别几乎是Java面试必考题。这类问题既能考察候选人对数据库底层的理解,又能测试对Spring框架的掌握程度。很多同学背了概念却不会结合实际场景分析,反而容易掉进面试陷阱。
二、事务基础必知必会
1. 什么是事务的ACID特性
- 原子性:要么全成功,要么全失败(最核心特性)
- 一致性:数据状态始终保持合法
- 隔离性:多事务并发时的互不干扰
- 持久性:提交后数据永久保存

三、Spring事务传播行为详解
1. REQUIRED(默认值)
当前有事务就加入,没有就新建。比如订单支付完成后调用积分服务,两个操作会在同一个事务中。
2. REQUIRES_NEW
必须新建独立事务。典型场景:日志记录必须和主业务事务分离,即使主事务回滚,日志仍需保存。
3. NESTED
嵌套事务,存在保存点机制。主事务回滚会连带嵌套事务回滚,但嵌套事务自己可以单独回滚。
4. 其他传播行为
- SUPPORTS:有就用,没有就非事务执行
- NOT_SUPPORTED:强制非事务执行
- NEVER:禁止事务存在
- MANDATORY:必须在已有事务中执行
四、事务隔离级别怎么选?
1. READ_UNCOMMITTED(最宽松)
可能读到脏数据,适用于对数据一致性要求极低的场景。
2. READ_COMMITTED(最常用)
解决脏读问题,但会有不可重复读。比如两次查询期间数据被其他事务修改。
3. REPEATABLE_READ
保证同事务内多次读取结果一致,但可能出现幻读(MySQL默认级别)。
4. SERIALIZABLE(最严格)
完全串行化执行,性能最差但安全性最高。

五、面试高频问题
1. 什么时候需要自定义隔离级别?
比如金融系统的转账操作需要SERIALIZABLE,而普通查询用READ_COMMITTED即可。
2. 传播行为和隔离级别有什么关系?
传播行为决定事务边界,隔离级别控制并发问题,二者配合使用。比如子方法用REQUIRES_NEW时,可以单独设置更高的隔离级别。
3. Spring和数据库的隔离级别以谁为准?
Spring的配置会覆盖数据库默认设置,但最终生效的是数据库支持的最高级别。
六、避坑指南
- 嵌套事务慎用NESTED,部分数据库不支持(如Oracle)
- @Transactional注解要特别注意方法可见性(需public方法)
- 事务超时设置要根据业务场景合理配置
- 使用异步线程时,事务上下文不会自动传递
小福利:如果大家需要购买面试鸭会员,可以通过面试鸭返利网找到我,额外返利25元!现在下单还能领取上文提到的Java面试宝典合集哦~


