2011-12-19 76 views
0

我有一個更新緩存表的觸發器。 由觸發器執行的功能進行兩項操作:刪除舊緩存行並添加一個基於ID的新緩存行,總數爲Postgresql函數鎖定錯誤

緩存表列:id |總

因爲高水平的服務器活動的,我相信兩個paralles在功能上會生成以下情況要求:

 
Delete 1 
Delete 2 
Insert 1 
Insert 2 (this will crash because of the primary key) 

有沒有什麼辦法可以防止這種情況?交易不應該阻止這種情況(postgresql函數中的隱含交易)

回答

1

您可以使用諮詢鎖。 http://www.postgresql.org/docs/9.0/interactive/functions-admin.html

BEGIN 
    PERFORM pg_advisory_lock(old.id); 
    DELETE FROM cache WHERE some_id = old.id; 
    INSERT INTO cache SELECT ...; 
    PERFORM pg_advisory_unlock(old.id); 
    RETURN old.id; 
END; 
$$ ... 

帕維爾

+0

如何pg_try_advisory_lock_shared?,也是他們安全嗎?第二份工作會等到第一份工作完成嗎? – danidacar 2011-12-19 15:11:46

+0

只有當您只會讀取緩存時纔可以使用共享鎖 - 但如果您使用重複讀取,則不需要讀取鎖定 – 2011-12-19 15:56:05