我的问题涉及Spring批处理和事务。
假设我为其中一个步骤选择了提交间隔50 。
另外假设我总共有1000条记录,其中一条记录会导致itemWriter失败,从而导致整个块的回滚(在我的示例中为50条记录)。
确保在作业完成后将49条有效记录写入数据库(并忽略有问题的块)的状态是什么?
答案 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
书中的段落。
这很棘手,回滚行为是不同的,具体取决于在读取,处理还是写入时是否抛出异常。
希望这对其他人有帮助。