【问题标题】:Spring Batch ORA-08177: can't serialize access for this transaction for BATCH_JOB_INSTANCESpring Batch ORA-08177: 无法为 BATCH_JOB_INSTANCE 序列化此事务的访问
【发布时间】:2021-06-10 21:04:17
【问题描述】:

在 Spring Batch v4.2.1 中,我们遇到错误 - SQL [INSERT into BATCH_JOB_INSTANCE(JOB_INSTANCE_ID, JOB_NAME, JOB_KEY, VERSION) values (?, ?, ?, ?)]; ORA-08177: 无法序列化此事务的访问。

尝试了link 底部提到的所有解决方法,但没有解决。在较低的环境中,ISOLATION_READ_COMMITTED 修复了该问题,但在 Prod 中,错误仍然存​​在。请帮助如何解决此问题。

【问题讨论】:

  • 所有环境下的oracle版本都一样吗?
  • 是的,ORACLE版本是一样的
  • 如果它在一个环境中工作,但在相同的 oracle 版本下不能在另一个环境中工作,那么您需要检查是否存在其他可能影响结果的差异。如果没有重现问题的minimal example,就很难找到根本原因。
  • 我检查了 CP 设置和其他细节,但一切都一样。同时遇到了这个docs.oracle.com/cd/B28359_01/server.111/b28318/…,并建议如果发生错误,请回滚trx并重新启动。这是 Spring batch v4.2.1 可以解决的问题吗?
  • @PrashantS 有一个 Spring Batch 问题未解决:github.com/spring-projects/spring-batch/issues/1127

标签: spring-batch


【解决方案1】:

最后通过实现 BatchConfigurer 接口并覆盖 getJobRepository() 以设置显式隔离级别来解决问题。

我们还尝试了其他修复(更改 initrans、扩展 DefaultBatchConfigurer、DS context.xml 中的 defaultTransactionIsolation="READ_COMMITTED"),但不幸的是,它们都没有奏效。

感谢@MahmoudBenHassine 的投入

@Override
@Bean
public JobRepository getJobRepository() throws Exception {
    JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
    factory.setDataSource(getPrimaryDataSource());
    factory.setTransactionManager(getTransactionManager());

    //Explicit set isolation level in order to avoid ORA-08177 error that occurred when multiple jobs run at the same time default is Serializable
    factory.setIsolationLevelForCreate("ISOLATION_READ_COMMITTED");
    return factory.getObject();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-02
    • 2014-04-17
    • 2022-11-29
    • 2021-01-13
    • 2019-02-02
    • 2021-08-12
    • 2020-02-29
    • 2021-04-14
    相关资源
    最近更新 更多