【问题标题】:Commit transaction after exception - undo setRollbackOnly异常后提交事务 - 撤消 setRollbackOnly
【发布时间】:2012-08-23 09:24:27
【问题描述】:

在我使用@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 的方法中,有时会由于SQLException 而发生org.eclipse.persistence.exceptions.DatabaseException。我捕捉到这个异常并通过另一个数据库查询来处理这种情况。但是,这个查询没有通过,因为异常,setRollbackOnly 被自动设置,我现在不能再提交事务了。

在 Java SE 中我会做一个明确的

manager.getTransaction().rollback();
manager.getTransaction().begin();

但在应用程序服务器中,这当然是行不通的。

在这种情况下,我能否以某种方式让我的数据库更改提交?

【问题讨论】:

  • 交易完成后能否获取交易状态?还是从事务中捕获异常并在新事务中执行所需的逻辑?
  • 我可以返回一个返回值,指示调用者重新执行他刚刚执行的方法。但是,我希望它对调用者透明。
  • 我的意思是在你的方法中调用其他方法..
  • 调用另一个带有 REQUIRES_NEW 注释的 bean 上的方法 ...
  • 是的,这可以工作 - 奇怪的是,我现在得到一个 SQLException XAER_PROTO : Routine was invoked in an inproper context

标签: jakarta-ee transactions ejb-3.0 eclipselink


【解决方案1】:

esej 的评论中给出的提示是解决方案: “调用另一个带有 REQUIRES_NEW 注释的 bean 上的方法。”

谢谢

【讨论】:

    【解决方案2】:

    当您尝试启动一个新的全局事务而前一个事务既未提交也未回滚时,您将出现“已调用例程等”错误。

    为了解决这个问题,您应该执行以下操作:

    当您捕获第一个异常时,不要将其留给容器将事务标记为“回滚”。您必须手动将事务标记为回滚。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-29
      • 1970-01-01
      • 2013-01-09
      • 2021-01-03
      • 1970-01-01
      • 2012-05-03
      • 1970-01-01
      相关资源
      最近更新 更多