Spring批处理中的commit-interval和处理回滚

时间:2012-07-11 09:08:05

标签: java transactions spring-batch commit chunks

我的问题涉及Spring批处理和事务。

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

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

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

2 个答案:

答案 0 :(得分:16)

经过一番研究,我想出了以下内容:

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

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

答案 1 :(得分:0)

  

我们专注于在阅读阶段跳过项目,但跳过   配置也适用于   面向块的步骤。 Spring Batch不会推动面向块的步骤   当在阅读中引发可跳过的异常时,方法相同,   处理或编写阶段。

     

当项目读取器引发可跳过的异常时,Spring Batch只是   再次在商品阅读器上调用read方法以获取下一个商品。   交易没有回滚。当物品处理器抛出   一个可跳过的异常,Spring Batch会回滚   当前块并将读取的项目重新提交给项目处理器,   除了触发了可跳过异常的   之前的运行。图8.3显示了Spring Batch在执行该项目时的操作   作者引发可跳过的异常。因为框架没有   知道哪个项目引发了异常,它将重新处理   在自己的交易中一一对应。

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

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

希望这对其他人有帮助。