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_
的锁,在另一个会话中查询谁在阻止第一个会话。
我有一个 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_
的锁,在另一个会话中查询谁在阻止第一个会话。