如何处理在MariaDB中工作的并发流程

时间:2019-06-24 08:04:27

标签: sql architecture mariadb

我们有一个应用程序,白天将收集事件并每天处理一次或两次。但是我们有一个数据库和两个应用程序实例,因此我们正在研究如何确保每个事件都被处理一次。

事件将包含注册的ID,并且我们每天要处理一次具有事件的每个注册一次或两次。我认为这意味着我们应该使用当前时间戳存储每个事件。但是我一直在考虑如何处理重复的实例。

一种方法是添加一列processingTimestamp,实例将SELECT行,其中该列为NULL,并将其UPDATE保留到当前时间。但是我相信,此工作流程不会最终阻止两个实例处理相同的注册。他们都可以在第一个SELECT发生之前做UPDATE

我想到的另一种方法是启动一个事务,以使注册中的所有事件都被锁定,而另一个实例无法到达它们,但是我觉得这并不是事务的真正目的。< / p>

在处理多个实例时,这似乎是一个常见的问题,但是解决方案是什么?

1 个答案:

答案 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