自定义未经检查的异常

时间:2018-03-21 10:55:54

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

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

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

  

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

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

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

陈述:

  

“此异常不会导致当前事务,如果是的话   active,标记为回滚。“

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

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

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

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

1 个答案:

答案 0 :(得分:0)

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

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