spring事務失效的8大場景
阿新 • • 發佈:2021-10-08
1、資料庫引擎不支援事務
從MySQL 5.5.5 開始的預設儲存引擎是:InnoDB,之前預設的都是:MyISAM,所以這點要值得注意,底層引擎不支援事務再怎麼搞都是白搭。
2、類沒有被spring管理
類上少了類似:@Component,@Controller,@Service, @Mapper或@Repository等註解。
3、@Transactional註解用在了非public修飾的方法上
4、同一個類中方法互相呼叫(自呼叫)
同一個類中方法A呼叫方法B(B方法上有@Transactional),無論方式A上是否有事務註解都會引起事務失效,因為只有當事務方法被當前類以外的程式碼呼叫時,才會由spring生成代理物件,通俗點講:自呼叫時該類對> 象還沒有被spring管理。
5、傳播行為配置成了不支援事務:Propagation.NOT_SUPPORTED表示不以事務執行,當前若存在事務則掛起。
6、異常被try-catch“吃掉了”
例如:Service中的方法丟擲了一個異常,然而在controller中又對異常進行的try-catch,service丟擲異常表示要回滾,然後controller中又對異常進行了捕獲和處理,controller中就會認為當前方法是正常提> 交的,不需要回滾,事務自然就會失效。
7、資料來源沒有配置事務管理器
8、異常型別不匹配