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

在单个事务中运行Spring批处理步骤,spring,spring-boot,transactions,spring-batch,Spring,Spring Boot,Transactions,Spring Batch,我正在编写Spring批处理作业,以: 从数据库表中读取一些记录 将它们写入文件 更新同一数据库表上的相同记录 到目前为止,我的解决方案包括: 从数据库中读取数据的 A,这反过来又代表 写入文件的方法 A以更新数据库中已处理的记录 如何确保整个步骤在单个事务中运行?只有在步骤成功的情况下,我才能提交数据库更新 以下是相关的基于Java的配置代码: @Bean public Step step1() { return stepBuilderFactory.get("st

我正在编写Spring批处理作业,以:

  • 从数据库表中读取一些记录
  • 将它们写入文件
  • 更新同一数据库表上的相同记录
  • 到目前为止,我的解决方案包括:

    • 从数据库中读取数据的
    • A,这反过来又代表
      • 写入文件的方法
      • A以更新数据库中已处理的记录
    如何确保整个步骤在单个事务中运行?只有在步骤成功的情况下,我才能提交数据库
    更新

    以下是相关的基于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();
    }
    
    @Bean
    公共步骤第1步(){
    返回stepBuilderFactory.get(“step1”)
    .chunk(…)
    .读者(……)
    .处理器(…)
    .writer(compositeWriter())
    .build();
    }
    @豆子
    公共CompositeItemWriter compositeWriter(){
    返回新的CompositeItemWriterBuilder()
    .delegates(…,jdbcWriter())
    .build();
    }
    @豆子
    公共JdbcBatchItemWriter jdbcWriter(数据源数据源){
    返回新的JdbcBatchItemWriterBuilder()
    .itemSqlParameterSourceProvider(…)
    .sql(“更新…”)
    .dataSource(数据源)
    .build();
    }
    
    首先,在单个事务中运行整个步骤并不是面向块的处理模型的目的。原因显然与处理大量数据时长时间运行的事务有关


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

    也许这会有所帮助:那么为什么要首先使用Spring批处理呢?因为尝试在1中运行这个事务基本上是违背了最初使用Spring批处理的目的。