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

@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 注解的方法,可能会绕过事务代理逻辑,导致事务行为异常。

相关文章:

  • 分布式之Raft算法
  • 流浪 ArchLinux 后续: 修复 fstrim USB SSD
  • Day9,Hot100(图论)
  • AnnotationConfigApplicationContext 函数作用
  • C++访问MySQL数据库
  • 2025 PHP授权系统网站源码
  • 2025最新面试自用题库---面试使用
  • 进程(2)
  • LLM大语言模型私有化部署-使用Dify的工作流编排打造专属AI诗词数据分析师
  • 如何设置Cursor中.cursorrules文件
  • mysql----查询,
  • 【算法】游艇租贷
  • C语言【指针篇】(一)
  • 计算机毕业设计SpringBoot+Vue.js企业客户管理系统(源码+LW文档+PPT+讲解+开题报告)
  • 【第一天】零基础学习量化基础知识点总览-持续更新
  • C++跳表实现,封装成Skiplist类
  • 零基础学C/C++160——字符串
  • 基于模仿学习(IL)的端到端自动驾驶发展路径
  • ESP32S3:参考官方提供的led_strip组件使用 SPI + DMA 方式驱动WS2812 RGB灯的实现思路 (实现各个平台移植使用该方式)
  • “conda”不是内部或外部命令,也不是可运行的程序或批处理文件
  • 网站导航的建设模板/软文是什么样子的
  • 福清市住房和城乡建设局网站/小程序推广方案
  • 做网站除了有服务器还需要什么问题/360投放广告怎么收费
  • 营销型网站建设是什么/网优工程师前景和待遇
  • 直销成功的三大秘诀/seo关键字优化教程
  • 购物网站制作代码/360应用商店