我将在某些并发环境(集群或多线程初始化)中使用liquibase作为应用程序启动插件。在liquibase库支持的并发环境中,是否可以保证数据库的正确更新,或者我必须手动更新?非常感谢。
Liquibase使用RDBMS的ACID事务特性实现了一个独占锁。这可以防止Liquibase的多个实例同时执行模式迁移。它是通过对Liquibase添加到您的模式中的DATABASECHANGELOGLOCK
表进行事务更新来实现的。
然而,这种机制并不能防止Liquibase未直接执行的操作可能导致的其他潜在并发问题。考虑这样的情况:集群中的一个节点正在执行模式迁移,而其他节点正试图使用该模式执行正常的业务逻辑。集群中的其他节点看到处于稳定状态A的模式,然后是一些中间变化,最后是处于稳定状态B。应用程序的设计必须能够处理这种转换,否则在进行迁移时需要停机。
同样,如果需要这样的环境,则应用程序有责任处理新旧客户端的混合(例如,在滚动升级期间),其中"正确"模式版本的概念不一致。