确保Cron作业不会两次执行相同的作业

时间:2018-10-27 06:21:19

标签: mysql cron execution overlapping

我在mysql数据库中有类似任务的列表,并且有一个PHP脚本,它一次可以提取1个任务并执行它。完成后,将标志从待处理更改为完成

我想通过添加在同一数据库上运行的更多脚本(最多20个)来提高性能。我如何确保这些脚本不会两次执行同​​一任务,即。处理表中的同一行

谢谢!

1 个答案:

答案 0 :(得分:0)

一种可能的方法是:

  • 您可以将flag列的数据类型更改为ENUM类型(如果尚未更改)。它将具有三个可能的Enum值:pendingin_processdone
  • 选择要执行的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;