【发布时间】:2020-06-03 14:47:42
【问题描述】:
我正在使用 spring batch 4.0.0、spring boot 2.2.0、java jdk 12.0.2、db sql server 2016。
并发执行的多个 Spring Batch 作业导致 Spring Batch 元数据表中的死锁。
我尝试了不同的解决方案:
- 我在元数据表上设置了身份
ALTER TABLE [OWN].[BATCH_JOB_EXECUTION_SEQ]
ADD CONSTRAINT [PK_BATCH_JOB_EXECUTION_SEQ] PRIMARY KEY CLUSTERED ([ID] ASC);
ALTER TABLE [OWN].[BATCH_JOB_SEQ]
ADD CONSTRAINT [PK_BATCH_JOB_SEQ] PRIMARY KEY CLUSTERED ([ID] ASC);
ALTER TABLE [OWN].[BATCH_STEP_EXECUTION_SEQ]
ADD CONSTRAINT [PK_BATCH_STEP_EXECUTION_SEQ] PRIMARY KEY CLUSTERED ([ID] ASC);
- 我确实覆盖了 JobRepository 和 JobExplorer 来配置隔离级别
@Override
protected JobRepository createJobRepository() throws Exception {
JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
factory.setDatabaseType(DATABASE_TYPE);
factory.setIsolationLevelForCreate(ISOLATION_REPEATABLE_READ);
factory.setDataSource(dataSource);
factory.setTransactionManager(getTransactionManager());
factory.setTablePrefix(TABLE_PREFIX);
factory.afterPropertiesSet();
return factory.getObject();
}
@Override
protected JobExplorer createJobExplorer() throws Exception {
JobExplorerFactoryBean jobExplorerFactoryBean = new JobExplorerFactoryBean();
jobExplorerFactoryBean.setDataSource(dataSource);
jobExplorerFactoryBean.afterPropertiesSet();
jobExplorerFactoryBean.setTablePrefix(TABLE_PREFIX);
return jobExplorerFactoryBean.getObject();
}
但是当我开始多份工作时,我经常/总是遇到同样的错误:
无法增加身份;嵌套异常是 com.microsoft.sqlserver.jdbc.SQLServerException: Transaction was deadlocked on lock resources with another process,并被选为死锁牺牲品。重新运行事务。
【问题讨论】:
-
您能否确认这是否与github.com/spring-projects/spring-batch/issues/1448相同的问题?
-
是的,是一样的,但是使用这些解决方案我总是遇到同样的问题。
-
该问题与 SF 中的一个未解决问题有关:github.com/spring-projects/spring-batch/issues/…,并且似乎有一种解决方法,方法是使用上述问题中所述的自定义增量器:github.com/spring-projects/spring-framework/issues/21425。
-
@MahmoudBenHassine 所以创建 2 个类就够了吗?
-
我无法回答这个问题,因为我没有尝试过(这就是我说“似乎有解决方法”的原因)。试一试,看看它是否能解决您的问题。
标签: java sql-server spring spring-boot spring-batch