一尘不染

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

hibernate

我有这样的方法:

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

如何从此异常中恢复?


阅读 265

收藏
2020-06-20

共1个答案

一尘不染

原来有一个我忽略了的“ 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();
 }
}
2020-06-20