EJB3 事务回滚

我在 EJB3 无状态会话 Bean 中使用 CMT。此外,我还创建了自己的异常,其中包含注释“@ApplicationException(rollback=true)”。

  1. 当我想回滚事务时,我是否必须使用“context.setRollbackOnly()”?

  2. 我可以通过在bean的公共方法中抛出一个异常来回滚事务吗?

  3. 如果是这样(Q#2的答案是肯定的),我是否必须通过在方法中声明异常来将异常抛出方法,或者只需在方法内部抛出异常并在相同的方法本身内处理它就足够了?(我不想将异常传播到下一个级别。我只想回滚异常。

提前致谢。;)


答案 1

首先,没有异常的回滚,它是事务的回滚。

  1. 如果抛出异常,则不必手动回滚事务。 强制容器回滚事务,如果没有异常,也是如此。@ApplicationException(rollback=true)Context.setRollbackOnly()
  2. 已检验的异常本身不会回滚事务。它需要有注释。如果异常为 a 并且未捕获异常,则会强制容器回滚事务。但请注意,在这种情况下,容器将丢弃 EJB 实例。@ApplicationException(rollback=true)RuntimeException
  3. 如 2.) 中所述),如果抛出 一个 ,事务将自动回滚。如果在代码中捕获已检验的异常,则必须使用 来回滚事务。RuntimeExceptionsetRollbackOnly

欲了解更多信息,请查看免费书籍Mastering EJB。它很好地描述了回滚方案,并且可以免费下载


答案 2

如何防止以注释方式声明的已检查异常导致抛出回滚传播到“上层”的问题尚未得到解答。

我认为这需要一个围绕所讨论的EJB的包装器,它吞噬了抛出的异常。(换句话说:我认为自定义异常必须针对方法边界抛出(因此不会在方法内部捕获和处理)并传播以产生事务效果 - 并且还会导致EJB实例的破坏。


推荐