簡體   English   中英

獲取postgres中的咨詢鎖

[英]Acquiring advisory locks in postgres

我認為必須有一些基本的東西,我不了解postgres中的咨詢鎖定。 如果我在psql命令行客戶端上輸入以下命令,則該函數兩次都返回true:

SELECT pg_try_advisory_lock(20); --> true
SELECT pg_try_advisory_lock(20); --> true

我原以為第二個命令應該返回false,因為應該已經獲取了鎖。 奇怪的是,我確實得到了以下內容,表明已經獲得了兩次鎖:

SELECT pg_advisory_unlock(20); --> true
SELECT pg_advisory_unlock(20); --> true
SELECT pg_advisory_unlock(20); --> false

所以我想我的問題是,如何以一種阻止它再次獲得的方式獲得咨詢鎖?

如果您將嘗試從2個不同的PostgreSQL會話中執行此操作,該怎么辦?

在文檔中查看更多內容。

我對咨詢鎖的第一印象是類似的。 我期望第二個查詢(SELECT pg_tryadvisory_lock(20))也返回false(因為第一個得到了鎖)。 但是此查詢僅確認值為20的bigInt具有鎖定。 解釋取決於用戶。

想象一下將顧問鎖定為一個表,您可以在其中存儲值並鎖定該值(通常是BigInt)。 沒有明確的鎖定,也不會延遲轉換。 這取決於你如何解釋和使用結果 - 它不會阻塞。

我在帶有兩個整數選項的項目中使用它。 SELECT pg_try_advisory_lock(classId,objId),而兩個參數都是整數。

要使它不僅僅使用表,只需將表的OID用作classId,將主要ID(此處為17)用作objId:

SELECT pg_try_advisory_lock((SELECT 'first_table'::regclass::oid)::integer, 17);

在此示例中,“first_table”是表的名稱,第二個整數是主鍵ID(此處:17)。

使用bigInt作為參數允許更廣泛的id,但是如果你使用“second_table”而不是id 17也被鎖定(因為你鎖定了數字“17”而不是與表中特定行的關系) 。

我花了一些時間才弄明白,所以希望它有助於理解咨詢鎖的內部運作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM