2025年Java面试宝典
链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g 提取码: 9b3g
Spring事务传播行为有几种?
作为Java程序员,面试中高频问题之一就是Spring事务传播行为,尤其是在考察框架底层原理时。很多同学在回答这类题目时,要么背不齐7种类型,要么分不清使用场景,今天我们就用大白话彻底搞懂这个问题。
什么是事务传播行为?
简单来说,事务传播行为(Propagation Behavior)定义了多个事务方法相互调用时,事务应该如何传递。比如方法A调用方法B,此时B的事务是沿用A的还是自己新开一个?这就是由传播行为决定的。

七种传播行为详解
Spring定义了7种事务传播行为,直接看名字可能有点懵,但其实可以分三类记忆:
1. 以当前事务为主
-
PROPAGATION_REQUIRED(默认):有事务就加入,没有就新建。
比如下单扣库存,如果外层有事务,扣库存就加入这个事务;如果没有,自己开一个。 -
PROPAGATION_SUPPORTS:有事务就加入,没有就不开事务。
适用于查询操作,比如查订单详情,有没有事务都行。 -
PROPAGATION_MANDATORY:必须存在事务,否则抛异常。
适用于必须依赖外部事务的场景,比如记录操作日志必须在事务内执行。
2. 不管有没有事务,我都要自己玩
-
PROPAGATION_REQUIRES_NEW:暂停当前事务,始终新建事务。
典型场景是日志记录:即使下单失败,日志必须独立保存。 -
PROPAGATION_NOT_SUPPORTED:挂起当前事务,以非事务方式执行。
比如发送短信通知,不需要事务,但需要和主事务解耦。 -
PROPAGATION_NEVER:不能在事务中执行,否则抛异常。
比如一些校验方法,强调必须无事务环境。
3. 嵌套事务
- PROPAGATION_NESTED:在已有事务中嵌套子事务。
子事务可以独立回滚,但主事务回滚会连带子事务。适合部分操作可独立回滚的场景,比如订单拆分子订单。

面试回答技巧
- 先说总数:直接回答7种,按分类描述。
- 解释常用类型:重点讲
REQUIRED、REQUIRES_NEW、NESTED的区别。 - 结合场景:比如电商下单用
REQUIRED,日志记录用REQUIRES_NEW。 - 避坑点:嵌套事务(NESTED)和独立事务(REQUIRES_NEW)的回滚范围不同。
高频追问问题
-
REQUIRED和REQUIRES_NEW的区别?
REQUIRED会加入当前事务,REQUIRES_NEW会挂起当前事务并新建。前者共进退,后者独立回滚。 -
NESTED和REQUIRES_NEW的区别?
NESTED是嵌套事务,主事务回滚会连带子事务;REQUIRES_NEW是完全独立的事务。 -
什么时候用NOT_SUPPORTED?
比如调用第三方接口(如支付回调),需要确保不受当前事务影响。

如果需要购买面试鸭会员,可以通过 面试鸭返利网 找我,返利25元!更多面试真题解析和实战技巧,欢迎访问 mianshiyafanli.com 。


