JavaEJBApplicationException:是否有一种方法可以区分捕获和未捕获异常的回滚行为



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

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

该过程是一个批量导入过程,它以块的形式导入大量数据。当transaction回滚时,整个chunk都会回滚,然后再次选择导入,因此整个过程会以无休止的循环重复。

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

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

但是捕获异常并不能阻止事务回滚。我现在已经读过了,明白这种行为是正常的。但问题是,你是怎么做到的?如何将异常配置为在捕获时不回滚,而在未捕获时仍执行回滚?我可以将异常的注释设置为@ApplicationException(回滚=false(,但在异常被抛出或未捕获的情况下,我会阻止回滚,对吧?在其他进程中,当抛出此异常时,回滚可能是明智的。在那里,我只是不想抓住它。有人知道我该如何做到这一点吗?

我已经尝试将异常更改为已检查的异常(…extends exception(,并将注释保留为rollback=true。它并没有改变行为(我一直在想/希望回滚=true可能只是在一个未捕获的异常上生效,并在我的情况下起作用……但没有(然后,我尝试了rollback=false的checked异常,不出所料,它成功了。但如前所述,我不想完全停用回滚。。。只有当异常被捕获时。如果可能的话,我想坚持使用RuntimeException,因为我们有这个"策略"来尽可能使用RuntimeExceptions,并且必要的throws声明将分布在整个应用程序中。。。

提前感谢。。。

Frank

您有不同的方法来管理这个问题。

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

最新更新