内部事务中的OptimisticLockException破坏外部事务

时间:2010-12-17 21:51:14

标签: hibernate spring transactions

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

1 个答案:

答案 0 :(得分:1)

好吧,经过一段时间的努力,我猜答案是否定的。无论何时捕获OLE,都必须确保启动新事务。我继续重新构建我的代码,以便中间不必捕获OLE。