異常: 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.csdn.net/xuhaogang3/article/details/82190026
問題分析:
1. 發現該類時 通過new Bean() 的構造方法的方式構造的,並沒有託管個spring 所以 該類無法執行事務,
2. 或者多線程類 僅僅用@Component 組件註釋,並沒有指明範圍 @Scope ,因爲spring 默認加載類都是單例模式,所以在加載 多線程類時就算加上組件 註解,但是沒有指定範圍,也不會加載到應用上下文中, 需要同時在類中註釋 @Component 和@Scope("prototype") ,如果 被cglib 代理還要在類上加上@EnableAspectJAutoProxy(proxyTargetClass=true) // 設置允許使用 代理類
3. 如果還有其他情況,先看看類有沒有交給spring託管