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

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

说我为我的一个步骤选择了 commit-interval of 50 .

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

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

回答(2)

2 years ago

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

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

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

2 years ago

我们专注于在阅读阶段跳过项目,但跳过配置也适用于面向块的步骤的处理和写入阶段 . 当在读取,处理或写入阶段抛出可跳过的异常时,Spring Batch不会以相同的方式驱动面向块的步骤 . 当项目阅读器抛出可跳过的异常时,Spring Batch只会在项目阅读器上再次调用read方法以获取下一个项目 . 交易没有回滚 . 当项目处理器抛出可跳过的异常时,Spring Batch回滚当前块的事务并将读取的项重新提交到项目处理器,但在上一次运行中触发可跳过异常的项除外 . 图8.3显示了当项目编写器抛出可跳过的异常时Spring Batch的作用 . 因为框架不知道哪个项目抛出了异常,所以它在自己的事务中逐个地重新处理块中的每个项目 .

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

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

希望这能帮到别人 .