我在 Spring Batch 中有一个块 tasklet。处理器从表 A 中读取,写入者在记录不存在时写入表 A。当我将提交间隔配置为 1 时,它工作正常。
当我将提交间隔配置为更高的数字时,我得到了重复的条目执行,因为处理器没有得到脏读信息。
我的 Tasklet 配置了 read uncommit 语句:
batch:transaction-attributes isolation = "READ_UNCOMMITTED"
我认为我的配置不接受这种配置?有任何想法吗?
我在 Spring Batch 中有一个块 tasklet。处理器从表 A 中读取,写入者在记录不存在时写入表 A。当我将提交间隔配置为 1 时,它工作正常。
当我将提交间隔配置为更高的数字时,我得到了重复的条目执行,因为处理器没有得到脏读信息。
我的 Tasklet 配置了 read uncommit 语句:
batch:transaction-attributes isolation = "READ_UNCOMMITTED"
我认为我的配置不接受这种配置?有任何想法吗?
您不应该遇到此问题,因为(通常)以这种方式管理读/处理/写:
你不需要使用READ_UNCOMMITTED
但更容易:
ItemReader<S>
(一个JdbcCursorItemReader
应该没问题)ItemProcessor<S,T>
ItemWriter<T>
,根据对象在数据库中的存在来写入/更新对象如果您想使用自定义编写器减少要写入的项目,您可以在流程阶段过滤掉重复的对象:您可以使用映射来存储重复的项目,如@jackson所述(仅适用于当前的块项目,而不适用于所有行)在数据库中 - 此步骤稍后由ItemWriter
)
脏读通常是一个可怕的想法。
听起来像是一个设计问题。
你应该做的是...... 1)听起来你应该引入一个缓存/映射来存储你计划提交但还没有写入数据库的条目。
如果条目已经在表 A 或缓存中,则跳过。如果该条目不在表 A 或缓存中,则将副本保存到缓存中,并将其添加到写入者要写入的候选列表中。