Java EE7 回滚事务

标签 java jakarta-ee transactions

我知道未经检查的异常 (RuntimeExceptions) 通常会导致您的事务回滚,但是如果您用相同的方法捕获该异常会怎样?当 errorOccurredtrue 时,我希望回滚整个事务。但我想知道捕获异常是否会吞下 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?");
   }
}

最佳答案

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

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

关于Java EE7 回滚事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52363171/

相关文章:

java - 正确实现所有相等对象的属性

sql-server - sql server 中事务的基本模板

sql-server - SQL Server 2008事务,需要回滚吗?

java - Java文献中 "visibility"的含义不明确?

java - 我不均匀地得到套接字超时异常

java - 使用 apache flink 进行有状态复杂事件处理

jsf - primefaces 日历 : how to set dynamically mindate

java - 如何使用@WebListener部署java EE监听器

jakarta-ee - 使用 Spring MVC 时如何在 WEB-INF 之外访问/公开

java - 在 JUnit 中使用 Spring 测试服务时如何回滚数据库事务?