
2025年Java面试宝典抢先看:点击获取(提取码:9b3g)
很多同学在面试中被问及Spring事务传播行为时,只能说出两三种类型。今天我们就深入聊聊这个高频面试考点,帮你彻底掌握事务传播机制的设计思想和应用场景。
<h3>为什么传播行为如此重要?</h3>在微服务架构和复杂业务系统中,事务传播行为直接决定了多个数据库操作如何协同工作。举个例子:当你在外层方法开启事务的情况下调用另一个事务方法,这两个事务是合并成一个还是各自独立?这时就需要通过传播行为来控制。

Spring定义了7种事务传播类型,这里用大白话解释:
-
REQUIRED(默认值)
如果当前存在事务就加入,没有就新建。像银行转账这种需要原子性操作的就用这个 -
REQUIRES_NEW
总是新建事务,如果已有事务就挂起。适合日志记录这种需要独立提交的操作 -
SUPPORTS
当前有事务就加入,没有就以非事务方式执行。比如查询操作可以灵活选择是否带事务 -
NOT_SUPPORTED
以非事务方式执行,如果存在事务就挂起。适用于不涉及数据修改的第三方接口调用 -
NEVER
强制要求不能存在事务,否则直接抛异常。用在需要严格保证无事务环境的方法 -
MANDATORY
强制要求必须存在事务,否则抛异常。用于必须参与事务的校验方法 -
NESTED
嵌套事务,可以独立回滚子事务。适合电商系统中订单和库存的关联操作
被问到"什么时候用REQUIRES_NEW?"时,可以这样回答:
"当我们需要保证某个操作不受外层事务影响时必须使用。比如用户支付成功后需要发送短信通知,即使后续业务出错需要回滚,这个短信发送应该独立提交。这时候就需要用REQUIRES_NEW新建独立事务。"

- 业务是否要求原子性
- 方法是否需要独立提交
- 是否允许影响主业务流程
<strong>注意:</strong>需要购买面试鸭会员的同学,通过面试鸭返利网找我下单可返25元,新用户还能领取面试题库!
<h3>常见误区分析</h3>很多同学会把NESTED和REQUIRES_NEW搞混:
- NESTED是嵌套事务,回滚时不影响外层事务
- REQUIRES_NEW是完全独立的新事务
- 不同数据库对嵌套事务的支持程度不同,使用前要确认
事务传播行为是Spring框架中非常重要的设计,理解透彻后不仅能应对面试,在实际开发中也能避免很多分布式事务的坑。建议大家结合具体的业务场景多做实验,观察不同传播行为下的数据库日志变化。


