Postgres原子插入间隔

时间:2018-01-03 11:55:15

标签: postgresql

鉴于下表,我需要能够运行多个并发进程,这些进程尝试每隔 n 秒插入新行。每 n 秒只能有一个成功:

CREATE TABLE scheduled_event_log (
  "key" varchar(64) NOT NULL,
  "timestamp_utc" timestamp without time zone default (now() at time zone 'utc')
);

例如,超过10秒的时间段将执行20个并发插入语句。只有其中一个应该成功。

如何实现这一目标?

1 个答案:

答案 0 :(得分:0)

可能您可以向表中添加另一个字段以表示秒间隔,并为该字段添加唯一键(以使重复插入尝试失败),而不是锁定表。在沿着这些行插入期间,该字段可以设置为默认值:

<div starts="{{ result | join('|', attribute='start') }}"></div>

或者,不是添加另一个字段,也许基于trunc(extract('epoch' from now())::numeric, -1) 的基于函数的唯一索引和上面的公式是有意义的。 timestamp_utc会截断剩余10秒分组间隔的秒数。

示例:

trunc(numeric, -1)

结果:

SELECT key, ts, trunc(extract('epoch' from ts)::numeric, -1)
  FROM (VALUES (1, '2017-01-01 08:30:01'::timestamp)
              ,(2, '2017-01-01 08:30:05'::timestamp)
              ,(3, '2017-01-01 08:30:09'::timestamp)
              ,(4, '2017-01-01 08:30:10'::timestamp)
              ,(5, '2017-01-01 08:30:15'::timestamp)
              ,(6, '2017-01-01 08:30:20'::timestamp)
       ) AS t (key, ts);