Как бороться с параллельными процессами, работающими в MariaDB - PullRequest
0 голосов
/ 24 июня 2019

У нас есть приложение, которое в течение дня будет собирать события и обрабатывать их один или два раза в день. Но у нас есть одна база данных и два экземпляра приложения, поэтому мы ищем, как убедиться, что каждое событие обрабатывается один раз.

События будут содержать идентификатор регистрации, и один или два раза в день мы хотим обрабатывать каждую регистрацию, в которой было событие. Я считаю, что это означает, что мы должны хранить каждое событие с текущей отметкой времени. Но я застрял, пытаясь понять, как их обрабатывать, принимая во внимание повторяющиеся экземпляры.

Один из способов - добавить столбец processingTimestamp, экземпляр будет SELECT строкой, в которой этот столбец равен NULL, а UPDATE - текущим временем. Но я считаю, что этот рабочий процесс не помешает двум экземплярам обрабатывать одну и ту же регистрацию. Они оба могут сделать SELECT до того, как произойдет первое UPDATE.

Другой способ, о котором я подумал, - это запустить транзакцию, чтобы все события из регистрации были заблокированы, и другой экземпляр не мог получить к ним доступ, но я чувствую, что это не совсем то, для чего предназначены транзакции.

Это похоже на обычную проблему, возникающую при работе с несколькими экземплярами, но каково решение?

1 Ответ

1 голос
/ 24 июня 2019

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...