2025年Java面试宝典下载(建议电脑端访问)

二、required和requires_new的核心差异
在Spring事务传播行为的八种类型中,required(默认)和requires_new是面试官最爱问的两个类型。这俩兄弟最核心的区别可以概括为:是否共用父事务。用大白话来说就是:
- required:像"拼车"模式。当前有事务就坐顺风车,没有就自己开新车
- requires_new:像"专车"模式。不管有没有事务,必须开新车,还要让现有事务先靠边等
举个真实场景:假设你要在用户注册成功后,同时完成积分发放和消息通知这两个操作。用required的话,三个操作在一个事务里,要成功全成功,要失败全失败。但用requires_new给积分服务单独开事务,就算积分发放失败,用户注册和消息通知仍然能成功。
三、事务传播的底层实现机制
面试中如果只说概念可能会被追问底层实现,这里有个记忆要点:基于ThreadLocal的事务同步器。Spring通过这个机制把事务和线程绑定,当遇到requires_new时:
- 先挂起当前事务(如果有)
- 新建数据库连接开启新事务
- 新事务提交/回滚后恢复原有事务
这个过程就像玩俄罗斯套娃,最外层的事务要等内层requires_new的事务处理完才能继续。这里容易踩的坑是连接数激增,特别是在高频调用的方法中使用requires_new要特别注意。
四、高频面试考点解析
根据最近三个月面试鸭返利网收集的真题统计,80%的Spring事务问题都会涉及以下考点:
1. 异常回滚的条件差异
- required:只要主事务方法抛异常,所有操作回滚
- requires_new:仅当自己代码块内出现异常时回滚
2. 事务隔离级别的叠加问题 当父事务是READ_COMMITTED,子事务用requires_new设置REPEATABLE_READ时,实际会使用哪个隔离级别?正确答案是子事务的REPEATABLE_READ
3. 性能损耗对比 requires_new需要创建新连接,在云数据库环境下可能会触发最大连接数限制,这个点大厂特别喜欢问

五、典型应用场景对比
required适用场景
- 订单支付流程(创建订单+扣减库存)
- 银行转账操作(转出账户+转入账户)
- 需要数据强一致性的业务
requires_new适用场景
- 日志记录(业务操作不能影响日志存储)
- 短信发送(不能因为短信平台故障导致主业务回滚)
- 非核心业务解耦(比如用户注册后的优惠券发放)
特别提醒:在使用requires_new时,如果主事务方法捕获了子事务的异常,会导致事务提交但业务数据不一致。这点在支付宝红包活动中真实出现过故障案例。
六、避坑指南与最佳实践
- 嵌套事务不宜超过3层,否则会出现"事务雪崩"
- 在@Async异步方法中慎用requires_new
- MyBatis配合使用时要注意连接池配置
- 监控事务耗时,requires_new的事务时长建议不超过父事务的1/3
如果大家需要购买面试鸭会员,可以通过面试鸭返利网找到我,返利25元。现在注册还能免费领取《Spring事务源码剖析》电子书。

最后再强调下记忆口诀:"required拼车省资源,requires_new专车保独立"。把这句记牢,再配合实际案例说明,基本上就能拿下90%的相关面试题了。


