异常: org.springframework.transaction.NoTransactionException: No transaction aspect-managed TransactionStatus in scope
执行的sql:
UPDATE sys_config SET remark='1.准备升级 2. 升级成功 3. 升级失败 4. 升级中' WHERE c_key='update_statue';
ALTER TABLE `sys_config`
ADD COLUMN `test` VARCHAR(50) NULL COMMENT 'test' AFTER `remark`;
环境: 类或方法上注解了 @Transactional(rollbackFor=Exception.class) , catch 异常处捕获异常时执行
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();//回滚
参考: https://blog.youkuaiyun.com/xuhaogang3/article/details/82190026
问题分析:
1. 发现该类是 通过new Bean() 的构造方法的方式构造的,并没有托管给spring 所以 该类无法执行事务,
2. 或者多线程类 仅仅用@Component 组件注释,并没有指明范围 @Scope ,因为spring 默认加载类都是单例模式,所以在加载 多线程类时就算加上组件 注解,但是没有指定范围,也不会加载到应用上下文中, 需要同时在类中注释 @Component 和@Scope("prototype") ,如果 被cglib 代理还要在类上加上@EnableAspectJAutoProxy(proxyTargetClass=true) // 设置允许使用 代理类
3. 如果还有其他情况,先看看类有没有交给spring托管