【发布时间】:2010-12-17 21:51:13
【问题描述】:
我有以下代码(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。显然情况并非如此,因为即使堆栈为 outer()->middle()->inner(),对 inner() 的调用也会引发 OLE。
现在,middle() 正在正确处理 OLE 并且重试成功,但是当需要关闭事务时,它已被 Spring 标记为 rollbackOnly。当middle() 方法调用最终返回时,关闭方面会抛出异常,因为它无法提交标记为rollbackOnly 的事务。
我不确定在这里做什么。我无法清除 rollbackOnly 状态。我不想在每次调用 inner 时都强制创建事务,因为这会影响我的表现。我是否遗漏了什么,或者任何人都可以看到我可以以不同的方式构建它的方法吗?
编辑:为了澄清我在问什么,让我解释一下我的主要问题。如果您在 @Transactional 方法中,是否可以捕获和处理 OLE?
仅供参考:事务管理器是 JpaTransactionManager,JPA 提供者是 Hibernate。
【问题讨论】:
-
信息不足,或者您没有清楚地描述问题。顺便说一句,outer() 中有递归调用吗?
-
我在最后添加了一个说明,说明了我的确切问题。 outer() 递归调用自身,middle() 也是如此。 inner() 不会递归调用自身。
标签: hibernate spring transactions