37

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

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

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

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

提前致谢。;)

4

2 回答 2

77

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

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

有关更多信息,请查看免费书籍Mastering EJB。它很好地描述了回滚场景,并且可以免费下载

于 2010-03-02T11:56:17.420 回答
0

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

我认为这将需要一个围绕有问题的 EJB 的包装器,它可以吞下抛出的异常。(换句话说:我认为自定义异常必须针对方法边界抛出(因此不能在方法内部捕获和处理)并传播以产生事务效果——并且反过来也会导致 EJB 实例的破坏。)

于 2013-05-15T13:18:14.067 回答