【问题标题】:Spring Batch Isolation LevelSpring Batch 隔离级别
【发布时间】:2021-01-20 03:07:20
【问题描述】:

我有一个 Spring Batch 作业,它每天使用不同的参数按顺序启动几次(下一个在上一个完成时启动)。 有时,我从数据库中收到 ORA-08177 错误。

为了防止这种情况,我设置了一个 customJobRepository 如下:

@Bean
    public Job createCamt(...
                          JobRepository customJobRepository) {
        return jobBuilderFactory.get("myJob")
                                .repository(customJobRepository)
                                ...
                                .build();
    }

    @Bean
    public JobRepository customJobRepository(
            @Qualifier("centralDataSource") DataSource centralDataSource,
            @Qualifier("centralTransactionManager") PlatformTransactionManager centralTransactionManager
    ) throws Exception {
        JobRepositoryFactoryBean factoryBean = new JobRepositoryFactoryBean();
        factoryBean.setDatabaseType("ORACLE");
        factoryBean.setDataSource(centralDataSource);
        factoryBean.setTransactionManager(centralTransactionManager);
        factoryBean.setIsolationLevelForCreate("ISOLATION_READ_COMMITTED");
        return factoryBean.getObject();
    }

看起来它不起作用,因为我仍然有来自数据库的 ORA-08177 错误。 我查看了 sql 以查看是否可以使用 read commited 隔离级别打开事务并且它可以工作:

SPRING_BATCH> set transaction isolation level read committed
[2020-10-05 10:35:43] completed in 3 ms
  1. 为什么 Spring Batch 的隔离级别不在read committed 上?
  2. 当每个作业单独运行时怎么会出现这个错误?

【问题讨论】:

    标签: spring-batch isolation-level


    【解决方案1】:

    您的自定义JobRepository 未被考虑在内,将其声明为 bean 是不够的。如果要使用自定义JobRepository,需要提供BatchConfigurer

    参考文档的Configuring a JobRepository 部分对此进行了说明。

    【讨论】:

      猜你喜欢
      • 2015-07-21
      • 1970-01-01
      • 2020-06-07
      • 1970-01-01
      • 2015-08-02
      • 2015-01-06
      • 2016-01-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多