【发布时间】: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.classjavax.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