【问题标题】:JEE / EJB default transaction behaviour of custom unchecked exceptionsJEE/EJB 自定义未检查异常的默认事务行为
【发布时间】:2018-08-30 11:06:50
【问题描述】:

环境:Java 8、JEE 7(无 Spring)、JBoss 7 GA、EJB 和 ManagedBeans、Informix 和 Oracle DB,使用默认 CMT。

我发现以下关于未经检查的异常及其回滚行为的声明:

"[...] 未经检查的异常 (RuntimeExceptions) 通常会导致 事务的回滚(除非注释为 @AppliationException(rollback=false)"

所以现在是以下未检查异常的javadoc

  • javax.persistence.NonUniqueResultException.class
  • javax.persistence.NoResultException.class

状态:

"这个异常不会导致当前事务,如果是 活动,标记为回滚。”

奇怪的是NonUniqueResultException 确实导致我的事务被回滚。所以我在方法中添加了以下几行:

@javax.transaction.Transactional(dontRollbackOn = {javax.persistence.NonUniqueResultException.class, javax.persistence.NoResultException.class})

此外,我使用自定义未检查异常 (... MyOwnException extends RuntimeException) 包装了这些异常,但我不确定默认行为:

三个问题: (1) 当我自己的自定义异常抛出时,是否回滚当前事务? (没有用@AppliationException 注释)(2) 什么是符合 JEE 规范的行为(因为显然现实世界的 JEE 实现有所不同)? (3) 如果事务被标记为回滚并且我有相当多的调用层次结构,我是否必须在每个方法中添加 dontRollbackOn 或每个事务只添加一次?

【问题讨论】:

    标签: jakarta-ee transactions ejb-3.0 java-ee-7


    【解决方案1】:

    Java EE 规范说未经检查的异常将导致活动事务的回滚。因此,如果您的自定义异常扩展 RuntimeException 他们将导致回滚。在这种情况下,无论您调用层次结构有多深,活动事务都将回滚。在同一个事务边界内所做的所有修改都会受到回滚的影响。

    另一方面,如果您的异常是已检查异常,除非您将其注释为 @ApplicationException(rollback = true),否则它不会导致事务回滚。

    【讨论】:

      猜你喜欢
      • 2015-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-21
      • 1970-01-01
      • 2012-12-28
      • 1970-01-01
      • 2018-08-19
      相关资源
      最近更新 更多