我在 EJB3 无状态 session bean 中使用 CMT。我还创建了自己的异常,带有注释“@ApplicationException (rollback=true)”。
当我想回滚事务时,是否必须使用“context.setRollbackOnly()”?
我可以通过在 bean 的公共(public)方法中抛出异常来回滚事务吗?
如果是这样(Q#2 的答案是肯定的)我是否必须通过在方法中声明异常来将异常从方法中抛出,或者只在方法中抛出异常就足够了?在同一方法本身内处理它? (我不想将异常传播到下一个级别。我只想回滚异常。)
提前致谢。 ;)
最佳答案
首先,没有异常回滚,它是事务的回滚。
- 如果您使用
@ApplicationException(rollback=true)
抛出异常,则无需手动回滚事务。Context.setRollbackOnly()
强制容器回滚事务,如果没有异常也是如此。 - 已检查异常本身不会回滚事务。它需要有注解
@ApplicationException(rollback=true)
。如果异常是RuntimeException
并且没有捕获到异常,它会强制容器回滚事务。但请注意,在这种情况下,容器将丢弃 EJB 实例。 - 如2.)所述,如果抛出
RuntimeException
,事务将自动回滚。如果您在代码中捕获到已检查的异常,则必须使用setRollbackOnly
来回滚事务。
如需更多信息,请查看免费书籍 Mastering EJB .它很好地描述了回滚场景并且免费提供给 download .
关于java - EJB3 事务回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2360764/