环境: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
或每个事务只添加一次?
答案 0 :(得分:0)
Java EE规范指出,未经检查的异常将导致活动事务的回滚。因此,如果您的自定义异常扩展了RuntimeException
,它们将导致回滚。在这种情况下,无论调用层次结构有多深,活动事务都将回滚。在同一事务边界内完成的所有修改都会受到回滚的影响。
另一方面,如果您的异常是已检查的异常,则除非您将其注释为@ApplicationException(rollback = true)
,否则不会导致事务回滚。