首页 > 解决方案 > 块处理模式下的 Spring Batch 事务回滚

问题描述

我试图了解在块步骤的编写器内部引发异常时发生了什么。我有一个 JdbcItemReader、一个处理器和一个 JPAItemWriter。我使用了 JdbcItemReader,因为处理器修改了一个字段的值,该字段也用于阅读器的 where 条件。

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

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

标签: transactionsspring-batchchunks

解决方案


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

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

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

推荐阅读