首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >EJB3事务回滚

EJB3事务回滚
EN

Stack Overflow用户
提问于 2010-03-02 03:42:38
回答 2查看 54.6K关注 0票数 37

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

  1. 当我想回滚事务时必须使用"context.setRollbackOnly()“吗?
  2. 我可以通过在bean中的公共方法中抛出一个异常来回滚事务吗?
  3. 如果是这样( Q#2的答案是肯定的),我必须通过在方法中声明异常而将异常从方法中抛出吗?还是仅仅在方法内抛出异常并在同一方法本身中处理它就足够了?(我不想将异常传播到下一个级别。我只想回滚异常。)

提前谢谢。;)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-03-02 11:56:17

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

  1. 如果使用@ApplicationException(rollback=true)抛出异常,则不必手动回滚事务。Context.setRollbackOnly()强制容器回滚事务,如果没有例外情况也是如此。
  2. 检查的异常本身不会回滚事务。它需要有注释@ApplicationException(rollback=true)。如果异常为RuntimeException,且未捕获异常,则将强制容器回滚事务。但是要小心,容器在本例中将丢弃EJB实例。
  3. ),如果您抛出一个RuntimeException,事务将自动回滚。如果在代码中捕获检查过的异常,则必须使用setRollbackOnly回滚事务。

欲了解更多信息,请访问免费书籍掌握EJB。它很好地描述了回滚场景,对于下载来说是免费的。

票数 79
EN

Stack Overflow用户

发布于 2013-05-15 13:18:14

关于如何防止以注释方式声明的检查异常导致抛出回滚传播到“上层”的问题,这里还没有回答。

我认为这将需要围绕所讨论的EJB设置一个包装器,从而吞噬抛出的异常。(换句话说:我认为必须针对方法边界抛出自定义异常(因此不能在方法中捕获和处理),并传播以获取事务效果--而且还会导致EJB实例的破坏。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2360764

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档