当前位置: 首页 > article >正文

@Transactional 嵌套,内层抛异常,外层用 try-catch 捕获但实际事务却回滚了

1. 内层事务传播行为为 Propagation.REQUIRED 且设置了回滚标记

虽然外层捕获了异常,但内层事务在抛出异常时可能已经标记了整个事务需要回滚。在 Spring 中,当内层事务传播行为为 Propagation.REQUIRED 时,它和外层事务属于同一个逻辑事务。若内层在抛出异常前或者异常处理逻辑中调用了 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly() 方法,那么即使外层捕获了异常,事务也会回滚。

2. 数据库隔离级别和锁机制影响

某些数据库的隔离级别和锁机制可能会导致即使异常被捕获,事务也会回滚。例如,在一些高并发场景下,当内层事务持有锁,并且在异常发生时数据库为了保证数据一致性,强制回滚整个事务。这种情况通常与数据库的具体实现和配置有关。

3. 异常类型与 rollbackFor 配置

如果 @Transactional 注解中配置了 rollbackFor 属性,并且内层抛出的异常类型符合该配置,即使外层捕获了异常,Spring 可能仍然会根据配置决定回滚事务。

4. AOP 代理问题

Spring 的事务管理是基于 AOP 代理实现的。如果代码存在 AOP 代理相关的问题,例如代理配置错误、方法调用不符合 AOP 代理规则等,可能会导致事务行为不符合预期。比如,在同一个类中,非代理方法调用带有 @Transactional 注解的方法,可能会绕过事务代理逻辑,导致事务行为异常。


http://www.kler.cn/a/555638.html

相关文章:

  • 设计模式在Qt中的应用
  • QT--QLineEdit
  • Qt的QToolButton样式设置
  • MySQL多列索引查询优化
  • JavaScript基础之深拷贝浅拷贝
  • Python 高级特性-切片
  • 网络安全知识:网络安全概念、内容和主要技术纵览
  • Hive JSON解析终极武器:魔改`json_tuple`源码支持嵌套路径完整指南
  • 七星棋牌源码高阶技术指南:6端互通、200+子游戏玩法深度剖析与企业级搭建实战(完全开源)
  • 【Server Components 解析:Next.js 的未来组件模型】
  • 最新本地部署 DeepSeekR1 蒸馏\满血量化版 + WebOpenUI 完整教程(Ubuntu\Linux系统\Ollama)
  • 【WPS+VBA】表格中重复表头与页码的批量删除
  • C/C++ 指针避坑20条
  • KT142C语音芯片支持的语音文件格式什么?Mp3还是wav呢?
  • 【Unity 游戏引擎插件】Modular Multiplayer FPS Engine (Mirror) (MMFPSE) 专注于帮助开发者快速构建多人第一人称射击(FPS)游戏
  • AI助力下的PPT革命:DeepSeek 与Kimi的高效创作实践
  • SQLMesh 系列教程7- 详解 seed 模型
  • 发现一个挺好的项目,可以在springboot项目中快速接入DeepSeek API,有需要的可以尝试一下
  • 技术总结 | MySQL面试知识点
  • 数据库系统概念