首页 > 解决方案 > Java EE7 回滚事务

问题描述

我知道未经检查的异常(RuntimeExceptions)通常会导致您的事务出现回滚,但是如果您在同一方法中捕获该异常会发生什么?errorOccurred我希望在is时回滚整个事务true。但我想知道捕获 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?");
   }
}

标签: javajakarta-eetransactions

解决方案


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

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


推荐阅读