Как правильно организовать работу 2 скриптов с 1 таблицей?
Доброго времени суток.
Прошу совета. Ранее не выполнял подобного
Имеется таблица, и есть 2 скрипта php
По крону одновременно вызываются оба скрипта и достают информацию, выполняют нужные действия и удаляют строку с таблицы.
Собственно сам вопрос. Как я могу защитить от дубликатов выполнения?
Если 1ый или 2ой скрипт уже выполнил select для данной строки в таблицы - другой выполнить уже не мог
Была идея ставить статус в БД, но что-то мне подсказывает что это не поможет
Какое логичное решение возможно7
Не очень понятно какую конкретно обработку вы делаете, но можно предложить варианты:
1. Добавить в ту же таблицу поле "в обработке" и игнорировать такие записи при выборке.
2. Тоже самое, но завести третью таблицу под очередь/статус обработки.
3. Может быть можно каким-либо образом разделить таблицу между скриптами (например, первая половина - один скрипт, другая второй).
Добавлю, что вариант 1 требует атомарности выставления флага или блокировки записи между селектом и апдейтом. Это самый простой вариант, и проще всего использовать его. Разве что при высокой нагрузке он покажет плохие результаты.
3 - отличный вариант по производительности, но требует введения механизма деления записей по потокам.
2 - это по-сути разделение бизнесовых данных и данных обработки, применять можно как к 1, так и к 3 варианту.
Vitsliputsli, спасибо, я как раз остановился в итоге перерыв интернет на варианте 1
Думал, возможно есть вакрианты получше, но увы и ах.
Спасибо за советы
Victor0816, варианты могут быть разные. Но в общем, для деления на потоки, вы либо можете установить заранее принадлежность к потоку, либо решать это при взятии записи в работу. На практике, варианты архитектуры могут очень сильно различаться. К примеру, если у вас очередь в брокере сообщений, то он сам может решать какую запись какому потоку отдать.
Все очень сильно упирается в архитектуру проекта, от нее зависят многие нюансы. К примеру, если записи в обрабатываемой очереди взаимозависимы (например, это могут быть апдейты одной и той же сущности), то лучше всю эту группу обрабатывать в одном потоке, конечно, можно ориентироваться и на время обновления, но это только если апдейты несут всю сущность, а не только измененные поля.
Была идея ставить статус в БД, но что-то мне подсказывает что это не поможет
не забудьте, что флаг должен выставлять атомарно - одним запросом, либо используйте блокировки select for update или чтото в этом роде, просто делать это в рамках транзакции недостаточно (а на такие заявления часто можно наткнуться).