Spring事務介紹
Spring事務是指在Spring框架中對數據庫操作進行管理的一種機制,它確保一組數據庫操作要么完全執行成功(提交),要么完全不執行(回滾),從而保持數據一致性和完整性。
Spring框架提供了多種事務管理方式,包括編程式事務管理和聲明式事務管理。其中,聲明式事務管理是通過在方法上添加@Transactional注解來實現的,通過簡單的注解配置,開發者可以將業務邏輯與事務管理分離,使得代碼更加清晰和易于維護。
失效原因
Spring事務失效可能由以下原因造成:
1、異常類型不匹配:Spring默認只回滾運行時異常(RuntimeException),如果拋出的是受檢異常(checked exception),需要通過@Transactional(rollbackFor = Exception.class)明確指定。
2、手動捕獲異常:如果在業務方法中手動捕獲并處理了異常,Spring事務管理器無法感知到異常,導致無法回滾。可以通過TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();顯式設置回滾。
3、非public方法:Spring聲明式事務是基于動態代理實現的,非public方法無法被代理,因此事務不會生效。
4、方法內部調用:Spring代理的是接口或類,因此直接通過this調用同類中的方法不會走代理,事務不會生效。可以通過注入自身或通過AOP實現。
5、事務傳播行為配置不當:@Transactional的propagation屬性配置錯誤,如設置為Propagation.NOT_SUPPORTED,會導致事務失效。
6、數據庫事務支持問題:如果使用的數據庫或數據庫驅動不支持事務,或者事務超時時間設置過短,也會導致事務失效。
7、Spring Bean未正確配置:類未添加@Service等注解,沒有被Spring容器管理,事務也不會生效。
8、自定義切面順序問題:如果自定義的切面和事務切面順序相同,并且沒有正確處理異常,也會導致事務失效。
9、父子容器問題:在Spring Boot中,如果父子容器掃描范圍設置不當,可能會導致事務配置未被正確加載。