[英]pg_try_advisory_lock and pg_advisory_unlock always return false
我有一个 node.js 应用程序,它使用 PostgreSQL 作为数据库。
当我尝试运行迁移文件(使用node-pg-migrate包)时,我不断收到错误消息: Another migration is already running
。
以下是引发错误的 package 的源代码。
我试过手动运行这些命令,它们都返回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 返回 false 因为它无法获得锁,因为其他人已经持有它,并且它不愿意等待,因为这就是try
在这里的意思。
pg_advisory_unlock 返回 false 因为您不能释放其他会话锁,只能释放您自己的锁。
您找不到任何阻塞查询,因为没有。 这就是try
的意思:不要阻塞,立即返回 false。 如果没有人被阻挡,那么就没有人在阻挡。
修改您的查询以查找谁持有咨询锁,即使他们没有阻止任何人:
select * from pg_locks join pg_stat_activity using (pid) where locktype='advisory';
或者,打开两个会话,其中一个在没有try_
的情况下获取锁,而在另一个 session 查询谁阻止了第一个会话。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.