Spring事务传播行为、隔离级别
2025年Java面试宝典:点击此处获取 ,提取码:9b3g
作为Java程序员,面试中被问到Spring事务的概率几乎100%!尤其是事务传播行为和隔离级别这两个核心概念,几乎是必考题。今天我们就从实际面试场景出发,聊聊怎么回答这类问题才能让面试官眼前一亮。
事务传播行为:多事务方法调用时的规则
事务传播行为解决的核心问题是:当多个事务方法相互调用时,事务应该如何传递? 比如方法A调用方法B,B是沿用A的事务,还是自己新开一个?
Spring定义了7种传播行为,但实际高频考点就4种:
- PROPAGATION_REQUIRED(默认):如果当前有事务则加入,没有则新建。
- PROPAGATION_REQUIRES_NEW:无论当前是否有事务,都新建一个独立事务。
- PROPAGATION_SUPPORTS:有事务就加入,没有则以非事务方式执行。
- PROPAGATION_NESTED:嵌套事务,子事务回滚不影响父事务,但父事务回滚会影响子事务。

面试回答技巧:
- 举例说明场景:比如电商下单扣库存和写日志,扣库存必须事务成功,写日志可以独立事务。这时候就可能用
REQUIRES_NEW。 - 一定要区分
REQUIRED和NESTED:后者是嵌套事务,依赖Savepoint机制实现部分回滚。
事务隔离级别:解决数据并发问题
事务隔离级别针对的是多个事务同时操作数据时可能引发的脏读、不可重复读、幻读问题。Spring支持的4种隔离级别对应SQL标准的4级:
- READ_UNCOMMITTED:可能读到其他事务未提交的数据。
- READ_COMMITTED(Spring默认):只能读到已提交的数据。
- REPEATABLE_READ:同一事务多次读取结果一致。
- SERIALIZABLE:串行化执行,完全隔离但性能差。

高频考点:
- Spring默认隔离级别为什么是
READ_COMMITTED?
答:在并发性能和数据一致性之间取得平衡,避免脏读且开销可控。 - 如何解决幻读?
答:数据库层可通过间隙锁(InnoDB),Spring层用SERIALIZABLE或结合版本号机制。
面试官最爱问的5个问题
-
传播行为中
NESTED和REQUIRES_NEW有什么区别?NESTED的子事务回滚不会影响父事务,但父事务回滚会连带子事务回滚。REQUIRES_NEW的子事务完全独立,父事务和子事务互不影响。
-
@Transactional失效的常见场景有哪些?- 方法非public
- 自调用(同一个类中方法A调用方法B)
- 异常类型未配置(默认只回滚RuntimeException)
-
MySQL的RR级别为什么能解决幻读?
- InnoDB通过MVCC+Next-Key Lock实现,但仅在当前读(如for update)时生效。
-
什么时候需要手动设置隔离级别?
- 需要更高一致性时(如金融场景用SERIALIZABLE)
- 需要更高并发时(如允许脏读的监控日志场景)
-
传播行为如何选型?
- 业务强一致性用
REQUIRED(如转账) - 辅助操作用
REQUIRES_NEW(如日志记录)
- 业务强一致性用

最后的小福利
如果大家需要购买面试鸭会员,可以通过面试鸭返利网找到我,返利25元!覆盖90%大厂真题的题库+专属解析,搭配本文提到的宝典资料,绝对能让你面试通关率翻倍!
记住:事务问题不仅要背概念,更要结合业务场景理解设计思想。如果觉得有用,赶紧收藏这份攻略吧~


