Spring事务失效-----十大常见场景及解决方案全解析
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