簡體   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