【问题标题】:Java EJB ApplicationException: Is there a way to have a differentiated rollback behavior for caught and uncaught Exceptions?Java EJB ApplicationException:有没有办法为捕获和未捕获的异常提供不同的回滚行为?
【发布时间】:2020-03-24 14:17:38
【问题描述】:

我遇到了标记为 @ApplicationException(rollback=true) 的捕获的 RuntimeException 的问题,它回滚了我的数据库事务并终止了该事务以执行以下操作。

@ApplicationException(rollback = true)
public class XyzValidationException extends RuntimeException {
   ...
}

该过程是批量导入过程,即批量导入海量数据。当事务回滚时,整个块被回滚,然后再次选择导入,所以整个事情在一个无限循环中重复。

应用服务器是 JBoss 7.1,数据库是 Oracle 11.2。

我想捕获异常,将导入源实体标记为错误,记录一些内容,然后继续处理其余数据。

但捕获异常并不能阻止事务回滚。我现在已经阅读并理解这种行为是正常的。 但问题是,那你怎么做呢?你如何配置异常在它被捕获时不回滚,并且在它未被捕获时仍然进行回滚? 我可以将异常的注释设置为@ApplicationException(rollback=false),但是我会阻止在抛出异常但未被捕获的情况下回滚,对吧? 在其他进程中,当抛出此异常时,回滚可能是明智的。在那里,我只是不想赶上ist。 有谁知道,我怎么能做到这一点?

我已经尝试将异常更改为已检查异常(... extends Exception),并将注释保留为 rollback=true。 它并没有改变行为(我在想/希望 rollback=true 可能只会对未捕获的异常生效,并在我的情况下做到这一点......但没有) 然后我用 rollback=false 尝试了检查异常,正如预期的那样,它成功了。但如前所述,我不想完全停用回滚......只有在捕获到异常时。 而且,如果可能的话,我想坚持 RuntimeException,因为我们有这个“策略”来尽可能使用 RuntimeExceptions,并且必要的 throws-declarations 将遍布整个应用程序......

提前谢谢...

弗兰克

【问题讨论】:

  • 当 EJB 抛出系统异常或应用程序异常且回滚设置为 true 时,无论是否捕获到异常,总是回滚事务,因为捕获(或未捕获)异常的客户端是超出交易范围。 EJB 的行为不能依赖于客户端捕获或不捕获异常的位置。要更改行为,您需要在 ejb 方法内或使用拦截器进行此操作
  • 感谢@areus 的评论...您写道“要更改您需要在 ejb 方法中执行的行为...”-您的意思是在相同的方法中捕获它扔了?
  • 是的。但是如果你不能修改 ejb 方法的代码,你可以应用一个拦截器

标签: exception transactions ejb rollback java-ee-7


【解决方案1】:

你有不同的方法来处理这个问题。

  1. 使用应用程序例外。默认情况下,所有checked 异常都是应用程序异常(RemoteException 除外)。在 CMT 模型中,此类异常不会导致自动回滚。因此,您可以在处理块期间处理发生的异常,并在不回滚的情况下执行诸如 log smth 之类的工作。对于其他情况,应使用导致自动回滚的未经检查的异常。
  2. 如果您的代码中有一些“政策”坚持未经检查的异常。您可以声明运行时异常,如XyzValidationException 并使用@ApplicationException(rollback = true) 对其进行注释,因此在抛出它的情况下,事务不会被回滚。对于所有其他代码,如果需要进行回滚,您可以使用 RuntimeException(默认情况下具有 rollback = false)。
  3. 如果可以在您的项目中使用 CDI,请查看它。它提供了@Transactional,其中包括rollbackOndontRollbackOn等属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    • 1970-01-01
    • 2011-08-13
    相关资源
    最近更新 更多