我们有一个应用程序,白天将收集事件并每天处理一次或两次。但是我们有一个数据库和两个应用程序实例,因此我们正在研究如何确保每个事件都被处理一次。
事件将包含注册的ID,并且我们每天要处理一次具有事件的每个注册一次或两次。我认为这意味着我们应该使用当前时间戳存储每个事件。但是我一直在考虑如何处理重复的实例。
一种方法是添加一列processingTimestamp,实例将SELECT
行,其中该列为NULL
,并将其UPDATE
保留到当前时间。但是我相信,此工作流程不会最终阻止两个实例处理相同的注册。他们都可以在第一个SELECT
发生之前做UPDATE
。
我想到的另一种方法是启动一个事务,以使注册中的所有事件都被锁定,而另一个实例无法到达它们,但是我觉得这并不是事务的真正目的。< / p>
在处理多个实例时,这似乎是一个常见的问题,但是解决方案是什么?
答案 0 :(得分:1)
FOR UPDATE
可能是您处理过程中的关键组成部分:
BEGIN;
SELECT (the rows you might process) FOR UPDATE;
do the processing
UPDATE (the rows you decided to process);
COMMIT;
此模式倾向于将冲突转变为延迟。也就是说,直到COMMIT
之后,所选的行才可用于任何其他进程。此时,其他进程将看到行已被处理,并跳过它们。
您不应允许BEGIN...COMMIT
运行超过几秒钟。
我看不到需要TIMESTAMP
。