0

众所周知,spring batch从2.0版本开始就使用了面向chunk的处理。

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

实际上,我试了一下,发现框架回滚了整个块。这不是我需要的,因为我不希望,比方说,当最后一个项目导致抛出异常时,已成功处理的 499 个项目在包含 500 个项目的块中回滚。

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

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

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

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

任何建议将不胜感激。

4

3 回答 3

0

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

于 2014-01-30T15:34:10.483 回答
0

你的权利:整个块都回滚了。

我遇到了同样的问题并做了以下事情:

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

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

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

于 2011-04-11T08:37:28.670 回答
0

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

于 2017-11-09T09:35:23.803 回答