【问题标题】:Java EE7 rollback a transactionJava EE7 回滚事务
【发布时间】:2018-09-17 07:56:49
【问题描述】:

我知道未经检查的异常 (RuntimeExceptions) 通常会导致您的事务出现回滚,但是如果您在同一方法中捕获该异常会发生什么?当errorOccurredtrue 时,我希望回滚整个事务。但我想知道捕获 Exception 是否会吞噬 RuntimeException 从而导致事务不回滚?此代码是否仍然回滚事务?

public static void main(String[] args) {
   try {
      // boring stuff...
      if(errorOccurred)
         throw new RuntimeException("RuntimeException is thrown.");
   } catch (Exception e) {
      System.out.println("RuntimeException cought. Does is still rollback transaction?");
   }
}

【问题讨论】:

  • 如果你传递给manual异常处理你应该自己回滚。
  • 那为什么要捕获异常呢?
  • @JackFlamp 在这个方法中还有其他一些事情需要处理检查的异常。否则我会摆脱它。
  • 那么您应该单独处理这些异常。 RuntimeExceptions 被定义为导致回滚
  • @JackFlamp 我想知道的是,如果在抛出 RuntimeException 后立即开始回滚,还是等到 catch/finally 块首先运行?

标签: java jakarta-ee transactions


【解决方案1】:

如果您的程序捕获到运行时异常,这意味着异常尚未到达 JEE 容器,因此从 JEE 容器的角度来看,这是正常的程序执行,因此它不会回滚事务。

如果您想捕获运行时异常并回滚事务,您需要以编程方式回滚那些特定运行时异常的事务。在会话 bean 中,它提供了具有 setRollbackOnly 方法的 sessioncontext 对象,使用此方法可以通知容器回滚事务而不会引发运行时异常。消息驱动 bean 还提供消息驱动上下文对象,可用于回滚事务[检查 MDB https://docs.oracle.com/javaee/6/tutorial/doc/bnbpo.html]

【讨论】:

    猜你喜欢
    • 2016-12-27
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    • 2011-09-19
    • 2012-12-30
    • 2011-01-22
    • 2011-09-19
    相关资源
    最近更新 更多