从hibernate乐观锁定异常中恢复

时间:2012-09-03 18:22:36

标签: java spring hibernate optimistic-locking

我有这样的方法:

@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最终会清除,但事实并非如此。

如何从此例外中恢复?

1 个答案:

答案 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();
 }
}