【问题标题】:OptimisticLockException in inner transaction ruins outer transaction内部事务中的 OptimisticLockException 破坏外部事务
【发布时间】: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


【解决方案1】:

好吧,在尝试了一段时间后,我想答案是否定的。每当您捕获 OLE 时,您必须确保开始新事务。我继续并重组了我的代码,这样中间就不必捕获 OLE。

【讨论】:

    猜你喜欢
    • 2014-07-17
    • 1970-01-01
    • 2021-10-15
    • 2019-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-10
    相关资源
    最近更新 更多