Spring 批处理中的提交间隔和处理回滚

我的问题与春季批次和交易有关。

假设我为其中一个步骤选择了 50 的提交间隔

还假设我总共有 1000 条记录,在这些记录中,有一条会导致 itemWriter 失败,从而导致整个块的回滚(在我的示例中为 50 条记录)。

在作业完成后(并忽略有问题的块)将49条有效记录写入数据库的状态是什么?


答案 1

经过一番研究,我想出了以下几点:

如果项目编写器未能提交块(此处为 50 个项目)从而导致回滚,则 Spring Batch 将单独重新运行有问题的块的每个项目,每个项目都有一个提交/事务。

因此,所有 49 个项目都将存在于数据库中,但导致 Spring Batch 回滚块的一个项目除外。


答案 2

我们专注于在读取阶段跳过项目,但跳过配置也适用于面向块的步骤的处理和写入阶段。Spring Batch 在读取、处理或写入阶段引发可跳过异常时,不会以相同的方式驱动面向块的步骤。

当项目读取器引发可跳过的异常时,Spring Batch 只需在项目读取器上再次调用 read 方法即可获取下一个项目。事务上没有回滚。当项目处理器引发可跳过的异常时,Spring Batch 将回滚当前块的事务,并将读取的项目重新提交到项目处理器,但在上一次运行中触发可跳过异常的处理器除外。图 8.3 显示了当项目编写器引发可跳过异常时 Spring Batch 执行的操作。由于框架不知道哪个项引发了异常,因此它会在自己的事务中逐个重新处理块中的每个项。

我引用了书中的段落。Spring Batch in Action, Manning

这是非常棘手的,回滚行为是不同的,这取决于是在读取,处理还是写入中引发异常。

希望这能帮助别人。


推荐