Spring chunk处理方式批量事务回滚
Spring Batch transaction rollback in chunk processing mode
我试图了解当块步骤的编写器内部抛出异常时发生了什么。
我有一个 JdbcItemReader、一个处理器和一个 JPAItemWriter。
我使用了 JdbcItemReader,因为处理器修改了一个字段的值,该字段也用在 reader.
的 where 条件中
如果在 JPAItemWriter 中抛出异常,则事务被标记为回滚,块大小设置为 1,并且 Spring 批处理一次向处理器发送一个项目以了解哪个抛出异常.
在重试阶段发送给处理器的项目没有原始字段值是否正常?它具有在处理器的第一个 运行 期间修改的值。
这样,处理器的第二个 运行 可能与第一个不同。
任何人都可以帮助我了解发生了什么?
这很正常,因为在重试期间会缓存项目。如果你想禁用它,你需要设置 FaultTolerantStepBuilder#processorNonTransactional() 标志。
也就是说,这里有两个重要的细节要提:
- 您应该正确实施
equals
和 hashcode
,因为这些方法用于识别重试中的项目。
- 在 fault-tolerant 步骤中,
ItemProcessor
实现应该是幂等的,如参考文档Fault tolerance 部分所述
我试图了解当块步骤的编写器内部抛出异常时发生了什么。 我有一个 JdbcItemReader、一个处理器和一个 JPAItemWriter。 我使用了 JdbcItemReader,因为处理器修改了一个字段的值,该字段也用在 reader.
的 where 条件中如果在 JPAItemWriter 中抛出异常,则事务被标记为回滚,块大小设置为 1,并且 Spring 批处理一次向处理器发送一个项目以了解哪个抛出异常.
在重试阶段发送给处理器的项目没有原始字段值是否正常?它具有在处理器的第一个 运行 期间修改的值。
这样,处理器的第二个 运行 可能与第一个不同。
任何人都可以帮助我了解发生了什么?
这很正常,因为在重试期间会缓存项目。如果你想禁用它,你需要设置 FaultTolerantStepBuilder#processorNonTransactional() 标志。
也就是说,这里有两个重要的细节要提:
- 您应该正确实施
equals
和hashcode
,因为这些方法用于识别重试中的项目。 - 在 fault-tolerant 步骤中,
ItemProcessor
实现应该是幂等的,如参考文档Fault tolerance 部分所述