【发布时间】:2021-06-09 04:17:18
【问题描述】:
我有一个 spring 批处理作业,它在基于块的步骤中从数据库读取并在进行一些处理后写入文件。 我的要求是同时运行几乎 16 个作业实例,只是使用不同的作业参数。
但我在这样做的过程中遇到了几个问题。
1.
无法为事务打开 JDBC 连接。嵌套异常是 java.sql.SQLTransientConnectionException: Hikaripool -1 - Connection is not available。
异常:无法增加标识。嵌套异常是 com.microsoft.SQLserver.jdbc.SQLServerException: Transaction (process ID 124) was deadlocked on lock resources with other process,并已被选为死锁牺牲品。重新运行事务。
我已经尝试了链接Github link 中提供的解决方案,方法是设置IsolationLevel 并更改元数据表,如下所示。
像这样设置 IsolationLevelForCreate
JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
factory.setIsolationLevelForCreate("ISOLATION_REPEATABLE_READ");
让 DBA 像这样为每个 SEQ 表添加索引(JET 是我将 repo 表放入的架构):
ALTER TABLE [JET].[BATCH_JOB_EXECUTION_SEQ]
ADD CONSTRAINT [BATCH_JOB_EXECUTION_SEQ_PK] PRIMARY KEY CLUSTERED ([ID] ASC)
GO
ALTER TABLE [JET].[BATCH_JOB_SEQ]
ADD CONSTRAINT [BATCH_JOB_SEQ_PK] PRIMARY KEY CLUSTERED ([ID] ASC)
GO
ALTER TABLE [JET].[BATCH_STEP_EXECUTION_SEQ]
ADD CONSTRAINT [BATCH_STEP_EXECUTION_SEQ_PK] PRIMARY KEY CLUSTERED ([ID] ASC)
GO
但我仍然面临这个问题。
PS:spring batch已经部署到AKS(Azure Kubernetes Services),使用Azure SQLServer作为数据源。
【问题讨论】:
-
要调查死锁,您检查死锁图,它会告诉您哪些资源导致了死锁,这通常足以解决如何修复它。否则,您只是在猜测并希望中奖。此外,您很可能无法消除所有死锁,在这种情况下需要重试系统。
标签: sql-server spring database spring-boot spring-batch