0

我在 Spring Batch 中有一个块 tasklet。处理器从表 A 中读取,写入者在记录不存在时写入表 A。当我将提交间隔配置为 1 时,它工作正常。

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

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

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

4

2 回答 2

0

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

  1. 读取是在单独的连接中完成的
  2. 块写入在其自己的事务中完成,用于跳过/重试/故障管理

你不需要使用READ_UNCOMMITTED但更容易:

  1. 创建一个ItemReader<S>(一个JdbcCursorItemReader应该没问题)
  2. 使用ItemProcessor<S,T>
  3. 编写自己的ItemWriter<T>,根据对象在数据库中的存在来写入/更新对象

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

于 2013-09-20T05:35:11.270 回答
-1

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

听起来像是一个设计问题。

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

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

于 2013-09-19T19:14:36.967 回答