Spring事務失效的常見場景及原因分析
Spring事務管理是開發中的核心功能,但在實際應用中可能因各種原因導致事務失效。以下是常見的事務失效場景及詳細解析:
1. 方法未被Spring管理
- 場景:使用
new
關鍵字直接創建對象,而非通過Spring容器注入 - 原因:Spring事務基于AOP代理,非容器管理的對象無法被代理
- 示例:
public class ServiceA {@Autowiredprivate ServiceB serviceB; // 正確方式:通過容器注入public void wrongWay() {ServiceB b = new ServiceB(); // 錯誤:手動創建對象,事務失效b.transactionalMethod();} }
2. 方法訪問修飾符錯誤
- 場景:事務方法使用
private
或final
修飾 - 原因:Spring代理無法攔截
private
方法(無法重寫),final
方法禁止重寫 - 規范:事務方法必須使用
public
修飾 - 錯誤示例:
@Service public class TransactionService {@Transactionalprivate void privateMethod() { /* 事務失效 */ }@Transactionalfinal void finalMethod() { /* 事務失效 */ } }
3. 同一類內方法調用
- 場景:類內非事務方法調用事務方法
- 原因:未通過代理對象調用,直接訪問目標方法
- 示例:
@Service public class ServiceA {@Transactionalpublic void transactionalMethod() {// 數據庫操作}public void nonTransactionalMethod() {transactionalMethod(); // 直接調用,事務失效} }
- 解決方案:通過
@Autowired
注入自身代理對象@Service public class ServiceA