运行 Spring 单个事务中的批处理步骤

Running a Spring Batch step in a single transaction

我正在写一个 Spring 批处理作业到:

  1. 从数据库中读取一些记录table
  2. 将它们写入文件
  3. 更新同一数据库中的相同记录table

我目前的解决方案包括:

如何确保整个步骤在单个事务中运行? 只有在步骤成功时我才能提交数据库 UPDATE

这里是相关的基于Java的配置代码:

@Bean
public Step step1() {
    return stepBuilderFactory.get("step1")
            .<Person, Person>chunk(...)
            .reader(...)
            .processor(...)
            .writer(compositeWriter())
            .build();
}

@Bean
public CompositeItemWriter<Person> compositeWriter() {
    return new CompositeItemWriterBuilder<Person>()
            .delegates(..., jdbcWriter())
            .build();
}

@Bean
public JdbcBatchItemWriter<Person> jdbcWriter(DataSource dataSource) {
    return new JdbcBatchItemWriterBuilder<Person>()
        .itemSqlParameterSourceProvider(...)
        .sql("UPDATE ...")
        .dataSource(dataSource)
        .build();
}

运行 单个事务中的整个步骤首先不是面向块的处理模型的目的。原因显然与处理大量数据时的长 运行 事务有关。

也就是说,没有什么能阻止您创建一个自定义步骤实现,如果这对您有用的话,它可以在单个事务中完成工作,即使我不建议这样做。