是否存在 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 锁定超时?的主要内容,如果未能解决你的问题,请参考以下文章

即使数据库解锁,liquibase 锁定异常

liquibase判断mysql表字段是否存在

如何为 liquibase 变更集设置超时?

PHP检查文件是不是被flock()锁定?

Liquibase - 执行前测试变更集

Liquibase 前置条件的 Groovy 语法是啥?