You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring MVC迁移Spring Boot后@Transactional报mandatory传播异常求助

解决Spring Boot迁移后@Transactional抛出No existing transaction found错误

问题描述

错误信息:

No existing transaction found for transaction marked with propagation 'mandatory'

从Spring MVC迁移到Spring Boot后,全应用范围内带有@Transactional注解的方法均抛出上述错误,Spring MVC环境下运行正常。已完成依赖升级、过滤器迁移等迁移操作。

方法执行流程:

  • 调用Action
  • Action的execute()方法调用某接口实现类中带有@Transactional注解的Save方法
  • 该类中还有另一个带有@Transactional注解的Dao方法

可能原因与解决思路

1. 事务管理器自动配置差异

Spring MVC需手动配置PlatformTransactionManager,而Spring Boot会根据classpath依赖自动配置,但可能出现以下问题:

  • 多数据源场景下,自动配置的事务管理器未绑定到实际使用的数据源,导致事务上下文无法创建。
  • 自定义事务管理器配置被Spring Boot自动配置覆盖,需检查配置类的@Primary注解或优先级设置。

2. 事务传播行为不匹配

mandatory传播行为要求当前必须存在活跃事务,否则抛出异常。迁移后可能存在:

  • Action类未被Spring容器管理(未标记@Component等注解),导致execute()方法无法触发事务创建,上层无事务时调用mandatory级别的Save方法就会报错。
  • 可调整Save方法的事务传播行为为REQUIRED(默认值,无事务则创建新事务),或给上层execute()方法添加@Transactional注解开启事务。

3. AOP代理方式不一致

Spring Boot默认使用CGLIB代理,Spring MVC可能使用JDK动态代理,代理方式不匹配会导致事务代理失效:

  • 若Service类未实现接口,CGLIB代理可正常生效;若依赖JDK动态代理但类无接口,会导致事务逻辑不生效。
  • 检查@EnableTransactionManagement的proxyTargetClass属性,设置为true可强制使用CGLIB代理,适配无接口的类。

4. 过滤器/拦截器破坏事务上下文

迁移过滤器时,执行顺序或逻辑变化可能清除事务上下文:

  • 检查自定义过滤器是否存在手动管理事务的代码,或修改了请求线程的上下文信息。
  • 确保Spring事务拦截器(TransactionInterceptor)在调用链中优先执行,避免过滤器提前破坏事务上下文。

内容的提问来源于stack exchange,提问作者Stotra

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 03:45:35