transactions - 块处理模式下的 Spring Batch 事务回滚
问题描述
我试图了解在块步骤的编写器内部引发异常时发生了什么。我有一个 JdbcItemReader、一个处理器和一个 JPAItemWriter。我使用了 JdbcItemReader,因为处理器修改了一个字段的值,该字段也用于阅读器的 where 条件。
如果在 JPAItemWriter 中抛出异常,则事务被标记为回滚,块大小设置为 1,并且 Spring Batch 一次向处理器发送一个项目,以了解哪个在抛出异常。
在重试阶段发送到处理器的项目没有原始字段值是否正常?它具有在处理器第一次运行期间修改的值。
这样,处理器的第二次运行可能与第一次不同。
任何人都可以帮助我了解发生了什么?
解决方案
这很正常,因为在重试期间会缓存项目。如果要禁用它,则需要设置FaultTolerantStepBuilder#processorNonTransactional()标志。
也就是说,这里有两个重要的细节要提到:
- 您应该正确实施
equals
,hashcode
因为这些方法用于识别重试中的项目。 - 在容错步骤中,
ItemProcessor
实现应该是幂等的,如参考文档的容错部分所述
推荐阅读
- javascript - 将值从 node.js 传递给 javascript
- node.js - Kudu 控制台挂在 npm install 上
- ibm-mobilefirst - 如何将 IBM MobileFirst 安装为集群
- android - Android 强制压缩带有 jpg 扩展名的 sqlite
- android - 启动画面未按预期工作 - Xamarin
- php - 带有 IN 子句和 LIMIT 的 PHP PDO
- azure - Azure 应用服务高内存消耗网络核心
- java - 确定名称是短名称、平均长度名称还是长名称
- getstream-io - 多个提要的相同活动
- java - Firebase 云消息传递突然返回 401