Spring chunk处理方式批量事务回滚

Spring Batch transaction rollback in chunk processing mode

我试图了解当块步骤的编写器内部抛出异常时发生了什么。 我有一个 JdbcItemReader、一个处理器和一个 JPAItemWriter。 我使用了 JdbcItemReader,因为处理器修改了一个字段的值,该字段也用在 reader.

的 where 条件中

如果在 JPAItemWriter 中抛出异常,则事务被标记为回滚,块大小设置为 1,并且 Spring 批处理一次向处理器发送一个项目以了解哪个抛出异常.
在重试阶段发送给处理器的项目没有原始字段值是否正常?它具有在处理器的第一个 运行 期间修改的值。
这样,处理器的第二个 运行 可能与第一个不同。

任何人都可以帮助我了解发生了什么?

这很正常,因为在重试期间会缓存项目。如果你想禁用它,你需要设置 FaultTolerantStepBuilder#processorNonTransactional() 标志。

也就是说,这里有两个重要的细节要提:

  • 您应该正确实施 equalshashcode,因为这些方法用于识别重试中的项目。
  • 在 fault-tolerant 步骤中,ItemProcessor 实现应该是幂等的,如参考文档Fault tolerance 部分所述