EJB3事务回滚

时间:2010-03-02 03:42:39

标签: java java-ee transactions ejb-3.0 rollback

我在EJB3无状态会话bean中使用CMT。我也创建了自己的Exception,其注释为“@ApplicationException(rollback = true)”。

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

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

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

  4. 提前致谢。 ;)

2 个答案:

答案 0 :(得分:68)

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

  1. 如果使用@ApplicationException(rollback=true)抛出异常,则无需手动回滚事务。如果没有异常,Context.setRollbackOnly()会强制容器回滚事务。
  2. 已检查的异常本身不会回滚事务。它需要有注释@ApplicationException(rollback=true)。如果异常是RuntimeException并且未捕获异常,则会强制容器回滚事务。但请注意,在这种情况下,容器将丢弃EJB实例。
  3. 如2.)中所述,如果您抛出RuntimeException,交易将自动回滚。如果在代码中捕获已检查的异常,则必须使用setRollbackOnly来回滚事务。
  4. 有关详细信息,请查看免费书籍Mastering EJB。它很好地描述了回滚场景,download是免费的。

答案 1 :(得分:0)

这里还没有回答如何防止注释异常声明导致回滚被抛弃到“上层”的问题。

我认为这需要一个围绕EJB的包装器来吞下抛出的异常。 (换句话说:我认为自定义异常必须抛出方法边界(因此不会在方法内部进行捕获和处理)并传播以获取事务效果 - 并且反过来又会导致EJB实例的破坏。)