Убедитесь, что cron не будет выполнять ту же работу дважды - PullRequest
0 голосов
/ 27 октября 2018

У меня есть список похожих задач в базе данных mysql и PHP-скрипт, который выполняет по одной задаче за раз и выполняет ее.Когда это сделано, он меняет флаг с в ожидании на готово

Я хочу повысить свою производительность, добавив больше скриптов (до 20), работающих в одной базе данных,Как мне убедиться, что эти скрипты не будут выполнять одну и ту же задачу дважды, т.е.Обработка той же строки в таблице

Заранее спасибо!

1 Ответ

0 голосов
/ 27 октября 2018

Один из возможных подходов:

  • Вы можете изменить тип данных столбца flag на тип ENUM (если это еще не сделано).Он будет иметь три возможных значения Enum: pending, in_process, done.
  • При выборе задачи pending, выполните явное LOCK наТаблица;так что никакой другой сеанс не сможет его обновить.

Пример кода:

LOCK TABLES tasks_table WRITE; -- locking the table for read/write

-- Selecting a pending task to do
SELECT * FROM tasks_table
WHERE flag = 'pending' 
LIMIT 1;

-- In application code (PHP) - get the Primary key value of the selected task.

-- Now update the flag to in_process for the selected task
UPDATE tasks_table 
SET flag = 'in_process' 
WHERE primary_key_field = $selected_value;
  • В конце не забудьте , чтобы освободить явноезамок.

код:

-- Release the explicit Lock
UNLOCK TABLES;
...