一尘不染

EJB3事务回滚

java

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

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

  2. 我可以通过在bean的public方法内抛出异常来回滚事务吗?

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

提前致谢。;)


阅读 226

收藏
2020-12-03

共1个答案

一尘不染

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

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

有关更多信息,请查阅免费书籍Mastering EJB。它很好地描述了回滚方案,可以免费下载

2020-12-03