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方法内打开不同的事务来处理此用例。