【spring】@Transactional 注解失效的原因及解决办法
@Transactional 注解失效的原因可能有以下几种:
- 注解没有正确配置在Spring配置文件中或者没有被Spring扫描到。
- 方法不是public的,@Transactional 注解只能应用于public的方法上。
- 类不是Spring管理的Bean,或者不在Spring的组件扫描路径下。
- 方法内部调用自身,导致事务不会被继承。
- 异常类型不被当前的事务设置捕获,必须是RuntimeException或者是Errors及其子类。
- 事务方法被非代理对象调用,即直接通过this引用调用。
解决办法:
- 确保@Transactional 注解已经在Spring配置文件中配置,并且开启了注解扫描。
- 将注解应用于public访问权限的方法上。
- 确保类是Spring的Bean,并且放置在正确的包下以被Spring扫描。
- 避免方法内部调用,或者使用AopContext.currentProxy()获取代理对象调用。
- 确保捕获的异常类型是正确的,或者在事务注解中指定正确的rollbackFor属性。
- 确保通过代理对象调用方法,例如通过依赖注入的Bean来调用事务方法。
示例代码:
@Service
public class MyService {
@Transactional
public void myMethod() {
// 事务性操作
}
}
确保myMethod是public的,并且MyService类被Spring正确管理。如果需要在同一个类中调用事务方法,可以这样操作:
@Service
public class MyService {
@Autowired
private MyService myServiceProxy;
public void myMethod() {
myServiceProxy.myMethod();
}
@Transactional
public void myMethodTransactional() {
// 事务性操作
}
}
在这个例子中,myServiceProxy是代理对象,它将会执行带有@Transactional注解的方法。
评论已关闭