Spring batch 在同一个表中读/写

Spring batch 在同一个表中读/写,spring-batch,Spring Batch,我有一个成批的小任务。处理器读取表格A,写入程序在记录不存在时写入表格A。当我将提交间隔配置为1时,它可以正常工作 当我将提交间隔配置为一个更高的数字时,我将获得双重条目执行,因为处理器没有获得脏读信息 My Tasklet配置了一个read uncommit语句: 批处理:事务属性隔离=读取\未提交 我认为我的配置中不接受此配置?有什么想法吗?一般来说,肮脏的阅读是一个可怕的想法 听起来这是一个设计问题 你应该做的是。。。 1听起来您应该引入一个缓存/映射来存储您计划提交但尚未写入数据库的条目

我有一个成批的小任务。处理器读取表格A,写入程序在记录不存在时写入表格A。当我将提交间隔配置为1时,它可以正常工作

当我将提交间隔配置为一个更高的数字时,我将获得双重条目执行,因为处理器没有获得脏读信息

My Tasklet配置了一个read uncommit语句: 批处理:事务属性隔离=读取\未提交


我认为我的配置中不接受此配置?有什么想法吗?

一般来说,肮脏的阅读是一个可怕的想法

听起来这是一个设计问题

你应该做的是。。。 1听起来您应该引入一个缓存/映射来存储您计划提交但尚未写入数据库的条目

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

您不应该遇到此问题,因为读/处理/写通常以这种方式管理:

读取是在单独的连接中完成的 区块写入在其自己的事务中完成,用于跳过/重试/故障管理 您不需要使用READ_UNCOMMITTED,但更简单:

创建一个ItemReader JdbcCursorItemReader应该可以 使用ItemProcessor处理您的项目 编写自己的ItemWriter,根据对象在数据库中的存在情况编写/更新对象
如果您想减少要使用自定义编写器写入的项目,您可以在流程阶段过滤掉重复的对象:您可以使用映射来存储重复的项目,如所述,仅用于当前区块项目,而不是数据库中的所有行-此步骤稍后由ItemWriter完成,您应该使用读卡器读取,不是处理器