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

时间:2011-03-09 14:25:26

标签: transactions spring-batch spring-transactions

众所周知,Spring版本从版本2.0开始使用面向块的处理。

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

实际上,我试了一下,看到框架回滚整个块。这不是我需要的,因为我不想要,比方说,当最后一个项目引发异常时,已成功处理的499个项目将被回滚到由500个项目组成的块中。

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

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

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

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

任何建议都将不胜感激。

3 个答案:

答案 0 :(得分:0)

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

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

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您可以使用Propagation.REQUIRES_NEW在writer方法中打开另一个事务来处理此用例。