在同一个表中读/写

我在Spring Batch中有一个chunk tasklet . 处理器读取表格A,当记录不存在时,写入者写入表格A.当我将commit-interval配置为1时,它可以正常工作 .

当我将commit-interval配置为更高的数字时,我得到了dublicate entry execptions,因为处理器没有得到脏的读取信息 .

我的Tasklet配置了一个read uncommit语句: batch:transaction-attributes isolation = "READ_UNCOMMITTED"

我认为我的配置中不接受这种配置?有任何想法吗?

回答(2)

2 years ago

您不应该遇到此问题,因为读取/进程/写入(通常)以这种方式进行管理:

  • 读取是在单独的连接中完成的

  • 块写入在其自己的事务中完成,用于跳过/重试/故障管理

您不需要使用 READ_UNCOMMITTED ,但更简单:

  • 创建 ItemReader<S>JdbcCursorItemReader 应该没问题)

  • 使用 ItemProcessor<S,T> 处理您的项目

  • 编写自己的 ItemWriter<T> ,根据数据库中的存在来编写/更新对象

如果要减少要使用自定义编写器写入的项目,可以在处理阶段过滤掉重复的对象:您可以使用映射来实现此目标,以存储@jackson描述的重复项目(仅适用于当前块项目,而不适用于所有行数据库 - 此步骤稍后由 ItemWriter 完成

2 years ago

脏读通常是一个可怕的想法 .

听起来这是一个设计问题 .

你应该做的是...... 1)听起来你应该引入一个缓存/映射来存储你计划提交的条目,但还没有写入db .

如果条目已在表A或缓存中,请跳过 . 如果条目不在表A或缓存中,则将副本保存到缓存中,并将其添加到写入者要写入的候选列表中 .