确保 cron 作业不会两次执行相同的作业
Posted
技术标签:
【中文标题】确保 cron 作业不会两次执行相同的作业【英文标题】:Make sure the cron job won't do the same job twice 【发布时间】:2018-10-27 06:21:18 【问题描述】:我在 mysql 数据库中有一个类似任务的列表和一个 php 脚本,它一次取出 1 个任务并执行它。完成后,它会将标志从 pending 更改为 done
我想通过添加更多在同一数据库上运行的脚本(最多 20 个)来提高我的性能。我如何确保这些脚本不会两次执行相同的任务,即。处理表中的同一行
提前致谢!
【问题讨论】:
【参考方案1】:一种可能的方法是:
您可以将flag
列的数据类型更改为ENUM
类型(如果还没有的话)。它将具有三个可能的枚举值:pending
、in_process
、done
。
在选择pending
任务时,请在表格上进行显式@ 987654322;以便没有其他会话可以更新它。
代码示例:
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;
【讨论】:
以上是关于确保 cron 作业不会两次执行相同的作业的主要内容,如果未能解决你的问题,请参考以下文章
为啥在 Kubernetes cron 作业中可能会创建两个作业,或者可能不会创建作业?