service的方法内事务控制不起作用
可能我们有这样的需求,Serveice 类中的methodA方法个methodB方法都加了事务的注解, methodA() 方法调用本类中的 methodB() 方法,methodB()方法中的事务机制不起作用。
public interface DemoService {
public void methodA();
public void methodB();
}
@Service()
public class DemoServiceImpl implements DemoService{
@Transactional(propagation = Propagation.REQUIRED)
public void methodA() {
this.b();
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void methodB() {
}
}
因为DemoService实现了个接口,使用代理时走的是动态代理,因此 methodA() 方法执行的时候使用的时Service类的代理对象,而this.methodB()使用的是未代理类AServiceImpl 的methodB方法,methodB方法是没有使用AOP的。
先说解决方法:
this.methodB();-----------修改为--------->((AService) AopContext.currentProxy()).methodB();
总结:
对于以Cglib方式增强的AOP目标类,会创建两个对象,一个是Bean实例本身,一个是Cglib增强代理对象,而不仅仅是只有后者。