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