我的问题涉及Spring批处理和事务 .
说我为我的一个步骤选择了 commit-interval of 50 .
还假设我总共有1000条记录,其中一条记录会导致itemWriter失败,从而导致整个块的回滚(在我的例子中为50条记录) .
什么是stategies以确保在作业完成后将49个有效记录写入数据库(并忽略有问题的块)?
经过一番研究,我想出了以下内容:
如果项目编写者未能提交块(此处为50个项目)从而导致回滚,则Spring Batch将单独重新运行有问题块的每个项目,每个项目一次提交/事务 .
因此,除了导致Spring Batch回滚块的一个项目之外,所有49个项目都将出现在数据库中 .
我们专注于在阅读阶段跳过项目,但跳过配置也适用于面向块的步骤的处理和写入阶段 . 当在读取,处理或写入阶段抛出可跳过的异常时,Spring Batch不会以相同的方式驱动面向块的步骤 . 当项目阅读器抛出可跳过的异常时,Spring Batch只会在项目阅读器上再次调用read方法以获取下一个项目 . 交易没有回滚 . 当项目处理器抛出可跳过的异常时,Spring Batch回滚当前块的事务并将读取的项重新提交到项目处理器,但在上一次运行中触发可跳过异常的项除外 . 图8.3显示了当项目编写器抛出可跳过的异常时Spring Batch的作用 . 因为框架不知道哪个项目抛出了异常,所以它在自己的事务中逐个地重新处理块中的每个项目 .
我引用书 Spring Batch in Action, Manning 中的段落 .
Spring Batch in Action, Manning
这非常棘手,回滚行为的不同取决于是否在读取,处理或写入时抛出异常 .
希望这能帮到别人 .
2 回答
经过一番研究,我想出了以下内容:
如果项目编写者未能提交块(此处为50个项目)从而导致回滚,则Spring Batch将单独重新运行有问题块的每个项目,每个项目一次提交/事务 .
因此,除了导致Spring Batch回滚块的一个项目之外,所有49个项目都将出现在数据库中 .
我引用书
Spring Batch in Action, Manning
中的段落 .这非常棘手,回滚行为的不同取决于是否在读取,处理或写入时抛出异常 .
希望这能帮到别人 .