13

我的问题与 Spring 批处理和事务有关。

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

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

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

4

2 回答 2

19

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

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

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

于 2012-07-11T12:38:57.533 回答
1

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

当一个 item reader 抛出一个可跳过的异常时,Spring Batch 只是再次在 item reader 上调用 read 方法来获取下一个 item。事务没有回滚。当项目处理器抛出可跳过的异常时,Spring Batch 回滚当前块的事务并将读取的项目重新提交给项目处理器,但在上一次运行中触发可跳过异常的项目除外。图 8.3 显示了当 item writer 抛出可跳过的异常时 Spring Batch 会做什么。因为框架不知道哪个项目引发了异常,所以它在自己的事务中一个一个地重新处理块中的每个项目。

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

这很棘手,回滚行为不同取决于是否在读取、处理或写入时抛出异常。

希望这对其他人有帮助。

于 2019-04-03T03:56:18.343 回答