我有这样的方法:
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void doSomeWork(){
Entity = entity = dao.loadEntity();
// do some related work
...
try {
dao.saveEntity(entity);
}
catch(StaleObjectStateException sose){
dao.flush(entity);
doSomeWork();
}
}
我期望通过使用REQUIRES_NEW事务传播和显示的递归,StaleObjectStateException最终会清除,但事实并非如此。
如何从此例外中恢复?
答案 0 :(得分:2)
原来有一点'gatcha'我忽略了......
来自春季文档
在代理模式(默认设置)下,只有“外部”方法调用 通过代理进入将被拦截。这意味着 '自调用',即目标对象中调用某些方法的方法 目标对象的其他方法,不会导致实际的事务 在运行时,即使调用的方法标有@Transactional!
因为我一直在内部递归,所以没有应用事务划分。
解决方案是通过代理递归,就像这样......
@Autowired
private ApplicationContext applicationContext;
@Transactional(propagation = Propagation.REQUIRES_NEW)
public void doSomeWork(){
Entity = entity = dao.loadEntity();
// do some related work
...
try {
dao.saveEntity(entity);
}
catch(StaleObjectStateException sose){
dao.flush(entity);
applicationContext.getBean(this.getClass()).doSomeWork();
}
}