Spring批处理面向块处理策略的回滚机制

问题描述:

众所周知,Spring批处理自2.0版以来使用面向块处理。Spring批处理面向块处理策略的回滚机制

这是否意味着,如果在项目编写器中发生异常,数据源事务管理器将回滚整个块或仅回滚相关项目?

其实,我试了一下,看到框架回滚了整个块。这不是我所需要的,因为我不想让那些已经成功处理的499个项目在包含500个项目的块中回滚,而最后一个项目导致抛出异常。

我能找到的唯一解决方案是将以下属性添加到我的tasklet。但是,我不确定这是否正确。

<batch:transaction-attributes propagation="NOT_SUPPORTED"/> 

另一种观点是简单地将块大小减小到1(一),但那个也没有多大意义。

也许Spring Batch不适合我的问题域。如果是这样,请告诉我,这样我就不会再为这种框架特定的行为而苦苦挣扎。

任何建议将不胜感激。

你的权利:整块大块被回滚。

我面临同样的问题,做了以下内容:

  • 根据数据库适应批量大小(我是用批处理语句来拯救我的更新)。对我们来说,25是一个很好的价值:优于1(批量收益),而不是太多(巨额交易)。
  • 重新启动此步骤的有限时间:我们启用了最多重新执行此任务3次。

这很好,因为在批处理过程中可能会发生更正(由GUI完成更正)。

在我们的流程结束时,标记为失败并重试3次的所有数据在我们的批处理报告中被明确标记为失败:然后需要人工更正或特殊处理。

解决方案可能是停止在writer中传播异常并捕获它。这将防止批处理在您捕获异常并执行自定义处理时回滚。

您可以使用Propagation.REQUIRES_NEW在writer方法内打开不同的事务来处理此用例。