我的问题涉及Spring批处理和事务。
假设我选择了一个提交间隔50作为我的步骤之一。
另外,假设我总共有1000个记录,其中一个将导致itemWriter失败,从而导致整个块回滚(我的示例中有50个记录)。
在作业完成后(忽略有问题的块),有哪些州可以确保将49条有效记录写入数据库?
发布于 2012-07-11 12:38:57
经过一番研究,我得出如下结论:
如果项目编写器未能提交一个块(这里有50个项),从而导致回滚,Spring批处理将分别为每个项重新运行问题块的每个项,并为每个项执行一个提交/事务。
因此,除了导致Spring批处理回块的一个项之外,所有49个项都将出现在数据库中。
发布于 2019-04-03 03:56:18
我们的重点是在阅读阶段跳过项目,但是跳过配置也适用于面向块的步骤的处理和写入阶段。当在读取、处理或写入阶段抛出可跳异常时,Spring批处理不会以相同的方式驱动面向块的步骤。 当一个项目读取器抛出一个可跳过的异常时,Spring只是再次调用项目读取器上的read方法来获取下一个条目。事务上没有回滚。当项处理器抛出一个可跳过的异常时,Spring批处理回滚当前块的事务,并将读取的项重新提交到项处理器,但在前一次运行中触发可跳异常的项除外。图8.3显示了当项目编写器抛出一个可跳过的异常时Spring所做的事情。因为框架不知道哪个项抛出了异常,所以它在自己的事务中逐个重新处理块中的每个项。
我引用Spring Batch in Action, Manning书中的这段话。
这是相当棘手的,回滚行为是不同的取决于异常是抛出在读取,处理还是写入。
希望这能帮到别人。
https://stackoverflow.com/questions/11429197
复制相似问题