繁体   English   中英

pg_try_advisory_lock 和 pg_advisory_unlock 总是返回 false

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM