【问题标题】:Container Managed Transaction in EJBEJB 中的容器管理事务
【发布时间】:2013-12-05 05:18:53
【问题描述】:

如果我将 EJB 标记为使用容器托管事务,并且从该 EJB 的方法中我没有显式使用 setRollBackOnly()(发生异常时),该事务是否仍会被标记为自动回滚?

【问题讨论】:

    标签: transactions ejb


    【解决方案1】:

    这取决于异常是应用程序异常(默认提交)还是系统异常(总是回滚)。应用程序异常是在 throws 子句中声明的最常见的检查异常,但它们也可以通过 @ApplicationException 注释(或 ejb-jar.xml 中相应的 <application-exception> 元素)声明。

    【讨论】:

    • 所以,如果抛出应用程序异常,并且我没有使用 @ApplicationException 或 标记它,那么我需要使用 setRollBackOnly() 回滚它?
    • @AyanBiswas 是的,但让我改写一下你所说的准确性:如果抛出应用程序异常,则需要使用 setRollbackOnly 手动回滚事务;您可以通过以下方式使异常成为应用程序异常:(1) 如果方法将其添加到 throws 子句中,(2) 对其进行注释 @ApplicationException,或 (3) 使用 <application-exception>
    【解决方案2】:

    如果抛出的异常从 RuntimeException 扩展,则事务将回滚。如果从 Exception 扩展(而不是 RuntimeException),则事务将提交。

    从 ejb 3.0 开始,您可以使用 @AnnotationException(或 ejb-jar.xml 文件中的应用程序异常部署描述符元素)更改此行为

    无论异常扩展什么类,如果您使用 @AnnotationException(rollback=true) 标记该类,则事务将永远不会提交,如果您使用 @AnnotationException(rollback=false) 标记异常,则相反。

    注意,如果你的代码抛出了异常,但是你在容器拦截它之前捕获了它,这个异常不会影响事务状态。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-26
      • 2020-10-25
      • 1970-01-01
      • 2013-10-07
      • 1970-01-01
      • 2012-10-07
      相关资源
      最近更新 更多