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

Transactions 面向块的Spring批处理策略的回滚机制,transactions,spring-batch,spring-transactions,Transactions,Spring Batch,Spring Transactions,众所周知,自版本2.0以来,SpringBatch使用面向块的处理 这是否意味着,如果项目编写器中发生异常,数据源事务管理器将回滚整个区块或仅回滚相关项目 实际上,我尝试了一下,看到框架回滚了整个块。这不是我所需要的,因为我不想,比方说,当最后一个项目导致抛出异常时,将成功处理的499个项目回滚到包含500个项目的块中 我能找到的唯一解决方案是将下面的属性添加到我的tasklet中。然而,我不确定这样做是否正确 <batch:transaction-attributes propagati

众所周知,自版本2.0以来,SpringBatch使用面向块的处理

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

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

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

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

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

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


如果您有任何建议,我们将不胜感激。

您的权利:整个区块已回滚

我面临同样的问题,并采取了以下措施:

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


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

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

您可以在writer方法中使用传播打开不同的事务。需要\u NEW来处理此用例