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
相关产品推荐
相关产品推荐

