目前有一个需求就是一个serviceA里有一个doService()方法提供给外部调用, doSomeThing调用了类里另外三个方法doA(), save1(), save2();它们的关系如下:
ServiceA{
doService(){
loop{
doA();
}
}
doA(){
save1();
save2();
}
save1(){
}
save2(){}
}
现在要实现的是在执行save2()方法出现异常时save1()保存的数据进行回滚,但不能回滚整个doService的事务,一般的做法是这样的
ServiceA{
@Transactional(propagation = Propagation.REQUIRED)
doService(){
loop{
doA();
}
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
doA(){
save1();
save2();
}
save1(){
}
save2(){}
}
很容易理解把doA方法放在一个新的事务里面这果出现异常时只会回滚新起的事务,不会回滚doService()的事务
这样的是没效果的,不是因为配置有问题,是因为事务管理原理是spring 通过动态代理来AOP拦截到调用方法来进行事务管理的
所以不能直接调用doA()方法,只能通过spring产生的代理类来访问该方法才可以.解决方法是在这个类本身注入一个它的一个代理类来调用如:
ServiceA{
@Autowired
private ServiceA serviceA;
@Transactional(propagation = Propagation.REQUIRED)
doService(){
loop{
serviceA.doA();
}
}
@Transactional(propagation = Propagation.REQUIRES_NEW)
doA(){
save1();
save2();
}
save1(){
}
save2(){}
}