站起来活动活动吧~

编程开发

流程引擎 Flowable/Activiti 无法启动报错:liquibase - Waiting for changelog lock....

2024年12月09日 20:45:20 · 本文共 1,315 字阅读时间约 4分钟 · 121 次浏览
流程引擎 Flowable/Activiti 无法启动报错:liquibase - Waiting for changelog lock....

如果你使用流程引擎 Flowable/Activiti,并且在程序启动时卡住,报错:liquibase - Waiting for changelog lock....,说明有数据库表没有释放锁,这里锁并不是数据库级别的锁表,所以你无法查询到被锁的表,这里的锁是逻辑上的锁。

解决方案

你需要检查以下数据库表,查询语句如下,主要看locked字段如果是1,那么说明锁是生效的状态:

SELECT locked FROM act_app_databasechangeloglock;
SELECT locked FROM act_cmmn_databasechangeloglock;
SELECT locked FROM act_co_databasechangeloglock;
SELECT locked FROM act_dmn_databasechangeloglock;
SELECT locked FROM act_fo_databasechangeloglock;
SELECT locked FROM flw_ev_databasechangeloglock;

解锁只需要修改这个状态值,我这里提供一个解锁模板,请根据你的实际情况修改:

UPDATE act_app_databasechangeloglock SET locked = 0, lockgranted = NULL, lockedby = NULL WHERE id = 1;
UPDATE act_cmmn_databasechangeloglock SET locked = 0, lockgranted = NULL, lockedby = NULL WHERE id = 1;
UPDATE act_co_databasechangeloglock SET locked = 0, lockgranted = NULL, lockedby = NULL WHERE id = 1;
UPDATE act_dmn_databasechangeloglock SET locked = 0, lockgranted = NULL, lockedby = NULL WHERE id = 1;
UPDATE act_fo_databasechangeloglock SET locked = 0, lockgranted = NULL, lockedby = NULL WHERE id = 1;
UPDATE flw_ev_databasechangeloglock SET locked = 0, lockgranted = NULL, lockedby = NULL WHERE id = 1;

如果你只想解决问题,到此为止即可,下面我们探索一下原理。

调查原理

其实,这是触发了 liqiubase 的数据库版本控制。LiquiBase 是一个用于数据库重构和迁移的开源工具,通过日志文件的形式记录数据库的变更,然后执行日志文件中的修改,将数据库更新或回滚到一致的状态。

DATABASECHANGELOGLOCK 表,用于控制 Liquibase 在应用变更时的并发访问。当 Liquibase 应用变更时,它会自动在表中创建一行记录,防止其他进程或线程同时修改数据库。当变更应用完成后,Liquibase 会删除这个表格中的记录,以允许其他进程或线程修改数据库。

如果我们强制程序退出,比如 kill -9 杀死了进程,或者在本地 Debug 运行时双击了停止按钮,都会造成进程强制退出,此时如果正好数据库表正在执行变更,这个锁没有来得及删除,就会造成锁一直存在,下次启动时一直在等待锁的释放。

综上所属,我们在退出程序时,还是最好等待程序自己完全执行完毕再退出,强制杀死进程可能会导致一些奇怪的问题出现。

商业用途请联系作者获得授权。
版权声明:本文为博主「任霏」原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.renfei.net/posts/1626402130325676121
评论与留言

以下内容均由网友提交发布,版权与真实性无法查证,请自行辨别。

微信搜一搜:任霏博客