【发布时间】:2013-12-05 05:18:53
【问题描述】:
如果我将 EJB 标记为使用容器托管事务,并且从该 EJB 的方法中我没有显式使用 setRollBackOnly()(发生异常时),该事务是否仍会被标记为自动回滚?
【问题讨论】:
标签: transactions ejb
如果我将 EJB 标记为使用容器托管事务,并且从该 EJB 的方法中我没有显式使用 setRollBackOnly()(发生异常时),该事务是否仍会被标记为自动回滚?
【问题讨论】:
标签: transactions ejb
这取决于异常是应用程序异常(默认提交)还是系统异常(总是回滚)。应用程序异常是在 throws 子句中声明的最常见的检查异常,但它们也可以通过 @ApplicationException 注释(或 ejb-jar.xml 中相应的 <application-exception> 元素)声明。
【讨论】:
@ApplicationException,或 (3) 使用 <application-exception>。
如果抛出的异常从 RuntimeException 扩展,则事务将回滚。如果从 Exception 扩展(而不是 RuntimeException),则事务将提交。
从 ejb 3.0 开始,您可以使用 @AnnotationException(或 ejb-jar.xml 文件中的应用程序异常部署描述符元素)更改此行为
无论异常扩展什么类,如果您使用 @AnnotationException(rollback=true) 标记该类,则事务将永远不会提交,如果您使用 @AnnotationException(rollback=false) 标记异常,则相反。
注意,如果你的代码抛出了异常,但是你在容器拦截它之前捕获了它,这个异常不会影响事务状态。
【讨论】: