我在EJB3无状态会话bean中使用CMT。我也创建了自己的Exception,其注释为“@ApplicationException(rollback = true)”。
当我想要回滚交易时,是否必须使用“context.setRollbackOnly()”?
我可以通过在bean中的public方法中抛出异常来回滚事务吗?
如果是这样(Q#2的答案是肯定的)我是否必须通过在方法中声明异常来抛出异常,或者仅仅在方法内抛出异常就足够了在同一个方法本身内处理它? (我不想将异常传播到下一个级别。我只想回滚异常。)
提前致谢。 ;)
答案 0 :(得分:68)
首先,没有回滚异常,它是事务的回滚。
@ApplicationException(rollback=true)
抛出异常,则无需手动回滚事务。如果没有异常,Context.setRollbackOnly()
会强制容器回滚事务。@ApplicationException(rollback=true)
。如果异常是RuntimeException
并且未捕获异常,则会强制容器回滚事务。但请注意,在这种情况下,容器将丢弃EJB实例。RuntimeException
,交易将自动回滚。如果在代码中捕获已检查的异常,则必须使用setRollbackOnly
来回滚事务。有关详细信息,请查看免费书籍Mastering EJB。它很好地描述了回滚场景,download是免费的。
答案 1 :(得分:0)
这里还没有回答如何防止注释异常声明导致回滚被抛弃到“上层”的问题。
我认为这需要一个围绕EJB的包装器来吞下抛出的异常。 (换句话说:我认为自定义异常必须抛出方法边界(因此不会在方法内部进行捕获和处理)并传播以获取事务效果 - 并且反过来又会导致EJB实例的破坏。)