鉴于下表,我需要能够运行多个并发进程,这些进程尝试每隔 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个并发插入语句。只有其中一个应该成功。
如何实现这一目标?
答案 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);