
2025年Java面试宝典下载地址(提取码:9b3g)
一、Spring事务传播行为深度解析
很多同学在面试中被问到"Spring事务传播行为"时容易卡壳,其实咱们只需要记住七种行为类型和它们的适用场景就能轻松应对。咱们重点说说最常见的三种:
-
PROPAGATION_REQUIRED:这是默认值,就像搭积木一样,当前有事务就加入,没有就新建。特别适合订单创建(主事务)和库存扣减(子事务)需要保持原子性的场景。
-
PROPAGATION_REQUIRES_NEW:不管当前有没有事务,直接新建事务。比如在用户积分变更时,即使主事务回滚了,积分日志仍然需要记录,这时候就得用这个属性。
-
PROPAGATION_NESTED:像俄罗斯套娃一样嵌套事务,如果主事务回滚,子事务跟着回滚;但子事务自己可以单独回滚。适合需要部分提交的场景,比如批量处理任务中的单个任务回滚。

二、事务隔离级别实战指南
数据库面试必问的四大隔离级别,咱们可以这样理解:
-
READ_UNCOMMITTED:能看到别人没提交的数据,就像开会时同事正在写的方案你直接拿来看。可能引发脏读,适用于对数据实时性要求极高的场景,比如股票实时行情。
-
READ_COMMITTED:只能看到提交后的数据,但同一个事务内两次查询结果可能不同。这是Oracle默认级别,适合大部分金融交易系统。
-
REPEATABLE_READ:保证同一事务内多次读取数据一致。MySQL的默认级别,就像给数据加了临时锁,适合库存管理系统。
-
SERIALIZABLE:完全串行化操作,相当于单线程处理事务。性能差但安全性最高,适合银行核心系统。
三、高频面试问题拆解技巧
当面试官问:"Spring事务失效的常见场景有哪些?"时,咱们可以这样回答:
- 方法不是public修饰符(Spring AOP代理的限制)
- 异常类型未被捕获(默认只回滚RuntimeException)
- 自调用问题(同一个类的方法互相调用不会触发事务)
- 多线程环境下的事务传播(不同线程的事务上下文不共享)
记得补充实际案例:比如用户注册服务调用短信服务,如果短信服务的事务配置为REQUIRES_NEW,即使注册失败短信仍会发送,这时候就要考虑业务是否需要这种设计。
四、避坑指南与最佳实践
根据我在电商项目的实战经验,分享三个避坑技巧:
- 谨慎使用@Transactional注解的timeout属性,特别是涉及分布式锁的场景
- 隔离级别不要盲目设置SERIALIZABLE,实测在百万级订单系统中会降低30%吞吐量
- 混合使用JPA和MyBatis时,注意事务管理器的配置顺序
需要购买面试鸭会员的同学,可以通过面试鸭返利网找到我,可返利25元。平台整理了最新的互联网大厂真题库,特别适合突击复习。

五、技术选型思路拓展
面对不同业务场景,咱们要灵活选择事务策略:
- 支付系统:推荐READ_COMMITTED + 重试机制
- 内容管理系统:可采用READ_UNCOMMITTED提升查询效率
- 社交 Feed流系统:结合异步消息队列实现最终一致性
记得事务不是银弹,在秒杀系统中大量使用事务反而会降低性能。这时候可以采用预扣库存+异步扣款的模式,通过业务补偿机制保证数据一致性。


