我有以下代码
我的问题在于,当我设计这些东西时,我假设得到OLE的唯一时间是事务关闭的时候。显然,这不是事实,因为调用
现在,
我不确定该怎么办。我不能清除
编辑:为了澄清我的问题,让我解释一下我的主要问题。如果您在@Transactional方法内部,是否可能捕获和处理OLE?
FYI:事务管理器是JpaTransactionManager,JPA提供程序是Hibernate。
(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()
都是事务性的原因。正如您所看到的,我通过更新实体并重试操作来处理OLEs。我的问题在于,当我设计这些东西时,我假设得到OLE的唯一时间是事务关闭的时候。显然,这不是事实,因为调用
inner()
时即使堆栈为outer()->middle()->inner()
也会抛出OLE。现在,
middle()
正在正确处理OLE并且重试成功,但当关闭事务时,它已被标记为rollbackOnly
。当middle()
方法调用最终返回时,关闭方面会抛出异常,因为它无法提交标记为rollbackOnly
的事务。我不确定该怎么办。我不能清除
rollbackOnly
状态。我不想强制在每次调用inner
时创建事务,因为那会降低我的性能。我是否遗漏了什么或者有没有人能够看到我可以以不同方式构建这个结构的方法?编辑:为了澄清我的问题,让我解释一下我的主要问题。如果您在@Transactional方法内部,是否可能捕获和处理OLE?
FYI:事务管理器是JpaTransactionManager,JPA提供程序是Hibernate。