是否存在 liquibase 锁定超时?
Posted
技术标签:
【中文标题】是否存在 liquibase 锁定超时?【英文标题】:Is there a liquibase lock timeout? 【发布时间】:2015-08-03 20:40:05 【问题描述】:您可以在此处的问题中看到:(liquibase-lock-reasons) 在 Liquibase 操作被中断时客户端 Liquibase 锁定的情况,使 liquibase 处于锁定状态。
我想知道是否有办法将 Liquibase 配置为从 LOCKGRANTED
列中的日期和时间自动检测这种情况。我认为如果您持有锁一个小时 - 您应该称其为过期锁。
我的问题是:
【问题讨论】:
【参考方案1】:没有锁定超时。 Liquibase 不知道预计 changeSet 需要多长时间,如果有些人在大型表上执行 DML,他们可能需要数小时才能成功运行。
您可以使用 releaseLocks 命令手动清除锁,或者您可以子类化 liquibase.lockservice.StandardLockService 以添加额外的逻辑以在一段时间后覆盖锁。
如果你只有一台机器要更新数据库,你也可以考虑https://github.com/liquibase/liquibase-nochangeloglock,它会完全禁用锁支持。
我可以将其视为可配置的有用功能,因此我确实添加了https://liquibase.jira.com/browse/CORE-2375 来跟踪该功能。
【讨论】:
【参考方案2】:其实看StandardLockService的代码,可以通过系统属性“liquibase.changeLogLockWaitTimeInMinutes”来配置...
public class StandardLockService implements LockService
...
private long changeLogLockWaitTime = 300000L;
....
public StandardLockService()
try
this.changeLogLockWaitTime = 60000L * Long.parseLong(System.getProperty("liquibase.changeLogLockWaitTimeInMinutes"));
LogFactory.getLogger().info("lockWaitTime change to: " + this.changeLogLockWaitTime);
catch (NumberFormatException var2)
;
【讨论】:
错误,这是 liquibase 等待释放锁的超时时间。【参考方案3】:有一些扩展可以添加超时或取消锁定。不幸的是,它们都可能很危险,因为它们不检查获得锁的原始进程是否仍然存在(并且正在工作)。
官方对 Postgres 去锁的支持仍未合并:https://github.com/liquibase/liquibase/pull/1417
有几个扩展也可以提供帮助:
https://github.com/oridool/liquibase-locking - 如果前一个会话不存在则解锁 (Postgres) https://github.com/szintezisnet/Kubernetes-Liquibase-Lock-Release - 基于 K8s 元数据解锁如果这还不够,您可以随时创建 Liquibase 扩展以满足您的需求。我这样做是为了支持我的单实例部署 https://github.com/hsiliev/liquibase-lock-timeout
【讨论】:
以上是关于是否存在 liquibase 锁定超时?的主要内容,如果未能解决你的问题,请参考以下文章