停用 Mongock-Lock 会产生什么后果?

问题描述 投票:0回答:1

Mongock 记录了数据库迁移的“默认、预期和记录的行为”是获取整个数据库的悲观锁

但是,可以在没有此锁的情况下运行迁移。通过在迁移中使用的存储库 bean 上使用

@NonLockGuarded
注释,无需黑客即可使用此功能(已建议将其作为另一个问题的解决方法,请参阅此线程)。

停用锁有哪些潜在危险,我需要遵守哪些规则才能安全地执行此操作?

java mongodb mongock
1个回答
1
投票

重要提示:不要将使用

@NonLockGuarded
与根本不使用锁混淆。锁仍然会被使用,但是,注释
@NonLockGuarded
停用了 Mongock 使用的技术之一。它实际上是不太重要的一个。

简短回答:虽然可能性很小,但其后果是同时部署的两个实例之间存在潜在的竞争条件。但正如我所说,这不太可能,我对使用注释非常有信心

@NonLockGuarded

长答案:虽然Mongock在启动进程之前获取锁,并且有一个守护进程在后台延长锁,但是如果进程超过了锁的获取时间,Mongock有一个额外的层来同步多个Mongock的runner(多个实例竞争)执行 Mongock 进程),其中它确保在执行每个同步操作(数据库操作或任何其他需要在运行程序之间同步的操作)之前以安全裕度获取锁。它为此使用 Java 代理。

在类、参数等上使用

@NonLockGuarded
注释时,不会执行此检查,并且如果守护程序出于任何原因无法正确扩展锁,则可能会导致竞争条件。

但是,这是 Mongock 添加的额外层(没有其他供应商这样做),以将竞争条件的可能性降至最低。但正如所说,即使没有这个,它也不太可能发生,我有信心在没有它的情况下运行 Mongock 进程,以防您需要通过

@NonLockGuarded
禁用。

注意:在下一个版本中,我们将添加一个配置参数来禁用整个过程的代理(

@NonLockGuarded
的作用)。

© www.soinside.com 2019 - 2024. All rights reserved.