【问题标题】:Is there a way to generate some set of rows exactly once on demand in Postgres?有没有办法在 Postgres 中按需生成一组行?
【发布时间】: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


【解决方案1】:

也许最简单的解决方案就是拥有一个单独的processed_ids 表,该表对所讨论的 id 具有唯一约束。您的函数可以尝试插入该表,如果出现异常,则该 ID 已被处理。

【讨论】:

  • 是的,这对我有用。我还必须在异常捕获代码中添加一个 while 循环,该循环适当地等待 确实 设法插入processed_ids 表的函数调用生成正确的行数,这可能不会如果不清楚应该计算多少行,请为其他有类似问题的人工作。但如果你这样做了,那么你就是金子!
猜你喜欢
  • 2017-04-12
  • 1970-01-01
  • 2014-06-19
  • 1970-01-01
  • 2022-12-17
  • 2016-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多