Postgresql Spring批处理无法通过DB(postgres)获得作业锁定

Postgresql Spring批处理无法通过DB(postgres)获得作业锁定,postgresql,spring-boot,spring-batch,spring-scheduled,Postgresql,Spring Boot,Spring Batch,Spring Scheduled,我有几个“orchestrator”微服务实例,它们运行在不同的节点上,并执行Spring批处理作业。一次只能有一个实例处于“活动”状态并执行该工作。通过带有cron表达式的@scheduled注释,每天安排两次作业。 因此,MocriseService尝试使用单个标识的JobParameter执行作业,该参数是LocalDateTime.now()截断为秒,以补偿我的实例运行的OpenShift节点之间的时间差。 底层数据库是Postgres 12,其事务隔离级别设置为可重复读取 这个问题对我

我有几个“orchestrator”微服务实例,它们运行在不同的节点上,并执行Spring批处理作业。一次只能有一个实例处于“活动”状态并执行该工作。通过带有cron表达式的
@scheduled
注释,每天安排两次作业。 因此,MocriseService尝试使用单个标识的
JobParameter
执行作业,该参数是
LocalDateTime.now()
截断为秒,以补偿我的实例运行的OpenShift节点之间的时间差。 底层数据库是Postgres 12,其事务隔离级别设置为可重复读取

这个问题对我来说似乎是不可能的,但它总是发生并重现作业在每个微服务实例上执行失败,在复合PK上执行
DuplicateKeyException
,复合PK是作业名称和标识参数的散列


问题是这怎么可能,我错过了什么?有什么想法吗?

很抱歉这么晚才回答。根本没有问题,无论事务隔离级别如何,锁都能正常工作。我们有两个OpenShift群集—活动和非活动。作业在“非活动”节点上运行,这些节点之所以被称为“非活动”节点,是因为没有路由到它们的客户端流量。事实证明,生产支持无法访问“非活动”节点日志:)

这种情况确切发生在什么时候?请共享您的代码,并在错误发生时显示,以便能够有效地帮助您。