【发布时间】:2015-05-30 04:20:57
【问题描述】:
基本问题是我们正在管理大量生成的行,并且仅在必要时仅生成一次这些数据是关键任务。假设你有一个数据关系:
CREATE TABLE sometable (
id SERIAL,
refID INTEGER,
...
);
现在,在一些 PL/PGSQL 函数中,我们有:
...
-- Advisory locks didn't help here? :(
IF FALSE = SELECT EXISTS( SELECT 1 FROM sometable WHERE refID = dataID) THEN
-- Generate fixed number of new rows in sometable that reference dataID.
END IF;
...
简而言之,应该不多次生成的行是。如前所述,PERFORM pg_advisory_lock(dataID) 形式的咨询锁遗憾地无助于防止这种情况发生。有希望吗?
编辑:忘了提到我在使用 pgbench 进行测试时遇到了重复数据问题。
编辑 2:错误的代码修复,澄清问题。
【问题讨论】:
-
把问题发到dba.stackexchange.com会得到更好的回复
-
您的问题到底是什么?你能解释一下是什么触发了函数调用,为什么需要锁以及锁没有帮助的原因是什么?
-
还有:
PERFORM * FROM sometable WHERE refID = dataID; IF found THEN ... END IF; -
感谢帕特里克的注意,我已经更新它以更清楚地说明问题。基本上应该(并且必须)只生成一次的行被生成了多次。
标签: postgresql locks mutual-exclusion