内部事务中的乐观锁异常破坏了外部事务。

3
我有以下代码 (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。

信息不足或者你没有清楚地描述问题。outer()函数中是否有递归调用? - maximdim
我在最后添加了一个澄清,说明了我的确切问题。outer()递归调用自身,middle()也是如此。inner()不会递归调用自身。 - Pace
1个回答

1

嗯,尝试了一段时间后,我想答案是否定的。每当捕获OLE时,您都必须确保启动新事务。我继续重构了我的代码,以便中间层不必捕获OLE。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接