2012-04-23 60 views
6

我認爲必須有一些基本的東西,我不瞭解postgres中的諮詢鎖。如果我psql的命令行客戶端上輸入以下命令,函數返回true兩次:在postgres中獲取諮詢鎖

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 

所以我想我的問題是,如何獲得一個在停止它再次被收購的方式諮詢鎖?

+8

從同一個會話中,您可以根據需要獲得多次相同的鎖定;但您必須釋放相同的次數或在另一個會話獲得鎖定之前關閉會話。 – kgrittn 2012-04-23 15:21:07

回答

11

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

瞭解更多in the docs

+2

啊我看到了,所以一旦會話獲得鎖定,它可以再次獲取它,但是另一個會話不能。謝謝! – foldl 2012-04-23 15:25:30

3

我對顧問鎖的第一印象是相似的。我期望第二個查詢(SELECT pg_tryadvisory_lock(20))也返回false(因爲第一個獲得鎖)。但是這個查詢只證實了一個值爲20的bigInt有一個鎖。解釋取決於用戶。

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

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

,使其與多工作表中只使用表作爲CLASSID和主ID(此處17)的ObjID的OID:

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

在這個例子中「first_table」是表名和第二個整數是主鍵ID(這裏是:17)。

使用bigInt作爲參數可以使用更廣泛的ID,但是如果將它與「second_table」一起使用,則也會將ID 17鎖定(因爲您鎖定了數字「17」而不鎖定與特定行的關係在表中)。

我花了一些時間來弄清楚,所以希望它有助於理解諮詢鎖的內部工作。

+0

我不明白這一點..你提到'但如果你使用它與「second_table」比ID 17被鎖定以及如何將ID 17將被鎖定在上述情況下跟隨諮詢鎖定時,我使用以下查詢'SELECT pg_try_advisory_lock((SELECT'first_table':: regclass :: oid):: integer,17);' – Viren 2016-04-28 07:43:27