pg_try_advisory_lock 和 pg_advisory_unlock 总是 return 错误

pg_try_advisory_lock and pg_advisory_unlock always return false

我有一个 node.js 应用程序使用 PostgreSQL 作为数据库。

当我尝试 运行 迁移文件(使用 node-pg-migrate 包)时,我不断收到错误消息:Another migration is already running.

下面是抛出错误的包的源代码。

我已经尝试 运行 手动执行这些命令并且它们都是 return false:

select pg_try_advisory_lock(7241865325823964) as "lockObtained";

select pg_advisory_unlock(7241865325823964) as "lockReleased";

经过一些谷歌搜索后,我发现下面的查询应该显示阻塞查询:

SELECT
    activity.pid,
    activity.usename,
    activity.query,
    blocking.pid AS blocking_id,
    blocking.query AS blocking_query
FROM pg_stat_activity AS activity
JOIN pg_stat_activity AS blocking ON blocking.pid = ANY(pg_blocking_pids(activity.pid));

但是,它给了我 0 个结果。


在这里我应该怎么做才能通过它的id释放这个咨询锁?为什么会这样?将来应该如何避免这种错误?

其他人持有锁。找出谁和为什么,也许终止那个后端。

pg_try_advisory_lock returns false 因为它拿不到锁,因为别人已经持有它,它不愿意等待,因为这就是try这里的意思.

pg_advisory_unlock returns false 因为你不能释放其他会话锁,只能释放你自己的锁。

您找不到任何阻塞查询,因为有 none。这就是 try 的意思:不要阻止,立即 return false。如果没有人被屏蔽,那么就没有人在屏蔽。

修改您的查询以查找持有咨询锁的人,即使他们没有阻止任何人:

select * from pg_locks join pg_stat_activity using (pid) where locktype='advisory';

或者,打开两个会话,在一个会话中获取没有 try_ 的锁,在另一个会话中查询谁在阻止第一个会话。