2012-09-03 126 views
0

我有这样的方法:从休眠中恢复的乐观锁定异常

@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

原来有一点我已经忽略了一个“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(); 
} 
}