面试常问!Spring七种事务传播行为一文通关

  在Spring的环境中,Spring框架通过@Transactional注解提供了强大的事务管理能力,当多个含有事务的方法嵌套调用时,每个事务方法都处于自己事务的上下文中,其提交或者回滚行为应该如何处理。

简单来说,就是当一个事务方法调用另外一个事务方法时,事务如何跨上下文传播。

  当事务方法A调用事务方法B时,事务方法B是合并到事务方法A中,还是开启新事务?当事务方法B抛出异常时,事务的回滚是如何处理的?不同的传播策略将直接影响数据一致性和系统性能。

事务传播行为定义了多个事务方法相互调用时,事务如何传递和边界如何界定

七种事务传播行为

REQUIRED(默认)

  默认的事务传播级别,表示如果当前方法已在事务内,该方法就在当前事务中执行,否则,开启一个新的事务并在其上下文中执行

  如果调用者没有事务,当调用方法A时,方法A会开启一个事务,然后调用方法B,方法B会加入到方法A开启的事务中,当这两个方法所有操作执行成功之后,提交事务。

当方法B 执行时抛出了 Exception 异常后,事务是如何处理的 ?

  由于方法A和方法B 同属一个事务,都会执行回滚(即使在方法A中使用 try-catch 处理了方法B的异常),REQUIRED在整个事务的调用链上,任何一个环节抛出的异常都会导致全局回滚。

REQUIRES_ NEW

  无论当前是否存在事务,都新建一个独立事务,原事务挂起

  如果调用者没有事务,当调用方法A时,方法A会开启一个事务1,此时再去调用方法B,事务1会挂起,方法B开启新的一个事物2开始执行,当方法B执行完毕后,提交事务2,恢复事务1,最终提交。

  方法B抛出异常时,方法B事务操作会回滚,当方法A中使用 try-catch 处理了方法B的异常,方法A不会受到影响。

SUPPORTED

  如果当前存在事务,则加入;否则以非事务方式执行

  • 当外层方法A存在事务,方法B加入到当前事务中,以事务的方式执行
  • 当外层方法A不存在事务,方法B不会创建新的事务,以非事务的方式执行

NOT_SUPPORTED

  以非事务方式执行,若当前存在事务则挂起

  方法A存在事务1,当调用方法B时,则挂起外层事务1,以非事务方式执行方法B,执行完毕后,恢复外层事务1并提交。

NEVER

  必须在非事务环境中执行,否则抛出异常

  方法A存在事务,当调用方法B时,方法B不支持事务,抛出异常。

MANDATORY

  必须在一个已有事务中执行,否则抛出异常

  当非事务方法A调用方法B时,由于方法B的传播性为MANDATORY,必须在事务中执行,所以抛出异常。

NESTED

  嵌套事务,可以在父事务和子事务之间进行嵌套调用,每个子事务都是父事务的一部分。当嵌套事务中的任何一个事务提交或回滚时,它们所处的上下文都会被更新。当父事务提交时,所有子事务都会一起提交,只有当父事务回滚时,所有子事务才会回滚

  方法A存在事务,内层方法B做为外层方法A事务的子事务执行,两个方法是一起提交,但子事务是独立回滚。方法B抛出异常时,会回滚方法B的所有操作,但不影响外层事务方法A(方法A需要try-catch方法B子事务)。当方法A发生回滚时,方发B同样回滚。

  如果方法A不存在事务,则内层方法B的规则与REQUIRED 一致。

总结

  Spring框架通过@Transactional注解提供了强大的事务管理能力,其中事务传播行为(Propagation Behavior) 更是解决多方法嵌套调用时事务协调问题的关键。

相关推荐
考虑考虑8 小时前
cmd局部设置java变量
运维·后端·自动化运维
怕浪猫9 小时前
长会话不崩盘:DeepSeek Harness 的上下文压缩与目标管理策略
面试·github·agent
ocean21039 小时前
2025-2026年Python面试高频知识点洞察
开发语言·python·面试·python八股文
陈随易11 小时前
在Finch用了62亿词元,我认为这是新一代Agent工具之神
前端·人工智能·后端
letisgo511 小时前
JAVA 高级进阶07篇《@Transactional失效的8个场景:代理机制到传播行为》
java·面试·transactional·spring事务·aop动态代理
wing9812 小时前
从codex转战workbuddy使用一周的感受
前端·人工智能·后端
EatFan12 小时前
Java接入支付宝 JSAPI 支付保姆教程(二):流程讲解与前后端代码讲解
前端·spring boot·后端·微信小程序·小程序·uni-app
步行cgn12 小时前
Spring 启动报错:BeanFactory not initialized 的原因与解决
java·python·spring
步行cgn13 小时前
Spring 报错:No bean class specified on bean definition 的原因与解决
java·后端·spring
凤山老林13 小时前
Spring Boot 整合 Flowable 的企业级落地指南
数据库·spring boot·后端·flowable·工作流