众所周知,Spring版本从版本2.0开始使用面向块的处理。
这是否意味着,如果项目编写者发生异常,数据源事务管理器将回滚整个块或仅回滚相关项目?
实际上,我试了一下,看到框架回滚整个块。这不是我需要的,因为我不想要,比方说,当最后一个项目引发异常时,已成功处理的499个项目将被回滚到由500个项目组成的块中。
我能找到的唯一解决方案是将下面的属性添加到我的tasklet中。但是,我不确定这是否正确。
<batch:transaction-attributes propagation="NOT_SUPPORTED"/>
另一种观点是简单地将块大小减少到1(一)但是那个也没有多大意义。
也许Spring Batch不适合我的问题域。如果是这样,请告诉我,这样我就不会再遇到那种特定于框架的行为了。
任何建议都将不胜感激。
答案 0 :(得分:0)
你的权利:整个大块都被回滚。
我遇到了同样的问题并做了以下事情:
这很有效,因为在批处理过程中可能会发生更正(由GUI完成更正)。
在我们的流程结束时,所有标记为失败并重试3次的数据在我们的批处理报告中明确标记为失败:然后需要人工纠正或特殊流程。
答案 1 :(得分:0)
解决方案可能是停止在编写器中传播异常并捕获它。这将阻止批处理在您捕获异常并进行自定义处理时回滚。
答案 2 :(得分:0)
您可以使用Propagation.REQUIRES_NEW在writer方法中打开另一个事务来处理此用例。