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