我有以下代码(OLE = OptimisticLockException)
...
public void outer() {
try {
middle()
} catch (OLE) {
updateEntities();
outer();
}
}
@Transactional
public void middle() {
try {
inner()
} catch (OLE) {
updateEntities();
middle();
}
@Transactional
public void inner() {
//Do DB operation
}
inner()
由其他非事务性方法调用,这就是为什么middle()
和inner()
都是事务性的。如您所见,我通过更新实体并重试操作来处理OLE。
我遇到的问题是,当我以这种方式设计东西时,我假设只有当事务关闭时,才能获得OLE。显然不是这种情况,因为即使堆栈为inner()
,对outer()->middle()->inner()
的调用也会抛出OLE。
现在,middle()
正在正确处理OLE并且重试成功但是当关闭事务时,它已被Spring标记为rollbackOnly
。当middle()
方法调用最终返回时,结束方面会抛出异常,因为它无法提交标记为rollbackOnly
的事务。
我不知道该怎么做。我无法清除rollbackOnly
州。我不想在每次调用内部时强制创建一个事务,因为这会影响我的表现。我错过了什么,或者任何人都能看到我可以用不同的方式构建这种方式吗?
编辑:为了澄清我的要求,让我解释一下我的主要问题。如果你在@Transactional方法中,是否可以捕获和处理OLE?
仅供参考:事务管理器是JpaTransactionManager,JPA提供者是Hibernate。
答案 0 :(得分:1)
好吧,经过一段时间的努力,我猜答案是否定的。无论何时捕获OLE,都必须确保启动新事务。我继续重新构建我的代码,以便中间不必捕获OLE。