从休眠乐观锁定异常中恢复

mys*_*mic 2 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();
 }
}
Run Code Online (Sandbox Code Playgroud)

我期望通过使用 REQUIRES_NEW 事务传播和显示的递归,StaleObjectStateException 最终会清除,但事实并非如此。

我如何从这个异常中恢复?

mys*_*mic 6

原来有一点我忽略了的'gatcha'......

来自 spring 文档

在代理模式下(默认),只有通过代理进入的“外部”方法调用才会被拦截。这意味着“自调用”,即目标对象中的一个方法调用目标对象的其他方法,即使被调用的方法用@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();
 }
}
Run Code Online (Sandbox Code Playgroud)