首页 > 解决方案 > 是否有可能在 Spring Batch 中引发致命的不可回滚异常?

问题描述

我尝试了所有组合noSkip(), noRetry(), noRollback()但我没有实现它。如果我在没有 的情况下设置该步骤noRollback(MyException.class),则一旦处理的行引发异常,该步骤就会失败,但它会回滚所有数据库操作。如果我使用noRollback(MyException.class),则数据库状态将保持不变,但我没有收到致命错误的日志,并且步骤不会中断/失败。

有什么方法可以直观地处理这个问题吗?这是我尝试的最后一个代码

  return this.stepBuilderFactory.get(STEP_PROCESS_ROWS)
            .faultTolerant()
            .noSkip(UnexpectedJobExecutionException.class)
            .noRetry(UnexpectedJobExecutionException.class)
            .noRollback(UnexpectedJobExecutionException.class)
            .reader(myReader)
            .processor(myProcessor)
            .writer(myWriter)
            .build();

标签: javaspringspring-batch

解决方案


是否有可能在 Spring Batch 中引发致命的不可回滚异常?

是的,像您一样使用FaultTolerantStepBuilder#noRollbacknoSkip并且noRetry有不同的含义。

如果我在没有 noRollback(MyException.class) 的情况下设置步骤,则一旦处理的行引发异常,该步骤就会失败,但它会回滚所有数据库操作。

这是默认行为。如果发生异常,事务将回滚并且步骤失败。

如果我使用 noRollback(MyException.class),则 db 状态将保持不变,但我没有收到致命错误的日志,并且步骤不会中断/失败。

这里没有什么令人惊讶的(我希望):由于事务没有回滚,所以状态保持不变并且步骤继续。确保将日志级别设置debug为获取所有详细信息。


推荐阅读