2011-12-19 90 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