sbh
@sbh

Как реализовать параллельную обработку записей таблицы?

Есть таблица с огромным количеством данных.
Есть скрипт который берет устаревшую запись (в таблице есть поле с отметкой последней обработки), обрабатывает ее и вносит результат обработки в таблицу.
Данных очень много в таблице, для ускорения обработки хочется запустить несколько экземпляров скрипта.
Но появляется проблема - экземпляры скрипта могут запросто схватить 1 и ту е запись из таблицы и начать ее обрабатывать одновременно.
Как реализовать параллельную обработку данных таблицы и избежать такого рода проблем?
Пока из идей только разве что добавить булево поле "in processing" и менять его когда какой-то из экземпляров скрипта хватает запись в обработку, после обработки менять данное поле обратно. Но тут возможна ситуация когда экземпляр скрипта по какой-то причине умрет и "in processing" останется в состоянии обработки навсегда.
  • Вопрос задан
  • 56 просмотров
Решения вопроса 1
ScriptKiddo
@ScriptKiddo
Скорее всего вам не нужно новое поле.
Используйте SELECT с хинтом FOR UPDATE.

Если сессия умрет - MYSQL автоматически откатит изменения в рамках транзакции

https://dev.mysql.com/doc/refman/8.0/en/innodb-loc...
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
phinnik
@phinnik
В фамилии ударение на первую о.
Сделайте обработку в несколько потоков, а для того, чтобы обработчики каждого потока случайно не взяли одно и то же, используйте очереди с блокировкой
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы