我遇到了一个按日期进行“预煮”程序的情况。如果该日期的数据是正确的,则只需将其返回即可,否则该过程将对其进行自动校准。
问题在于,如果烹饪过程花费的时间太长,则可能会重复复制数据。
我希望这个工作流程:
用户A从Web应用程序打开一个会话,并请求2018年6月的数据,名为proc_A
的过程将检查该月的数据并将其烹饪(如果尚不存在)。 / p>
用户B从桌面应用打开另一个会话,并请求2018年6月的相同数据,然后他们应该收到一条消息,说数据正在准备中,请稍候。
是否可以仅通过在PostgreSQL数据库中进行更改而不是对Web应用程序和桌面应用程序进行更改来实现?
答案 0 :(得分:1)
我会在数据表中添加一个状态列:
ready boolean DEFAULT FALSE
工作流程如下:
INSERT INTO data (month, value, ready)
VALUES (date_trunc('month', current_timestamp)::date, NULL, FALSE)
ON CONFLICT (month) DO NOTHING;
如果插入一行,则继续烹饪该值,然后运行
UPDATE data SET
value = 42, ready = TRUE
WHERE month = date_trunc('month', current_date)::date;
如果第一条语句未插入任何行,请运行
SELECT value, ready
FROM data
WHERE month = date_trunc('month', current_date)::date;
如果ready
为真,则返回数据,否则,告诉客户端请等待。