在同一个表中读/写

时间:2013-09-18 15:53:28

标签: spring-batch

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

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

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

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

2 个答案:

答案 0 :(得分:0)

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

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

    1. 创建ItemReader<S>(一个JdbcCursorItemReader应该没问题)
    2. 使用ItemProcessor<S,T>
    3. 处理您的项目
    4. 编写您自己的ItemWriter<T>,根据其在数据库中的存在来编写/更新对象
    5. 如果要减少要使用自定义编写器写入的项目,可以在处理阶段过滤掉重复的对象:您可以使用映射来实现此目标,以存储@jackson所描述的重复项目(仅适用于当前块)项目,而不是数据库中的所有行 - 此步骤稍后由ItemWriter

      完成

答案 1 :(得分:-1)

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

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

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

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