mysql - 确保 cron 作业不会重复执行相同的作业

标签 mysql cron execution overlapping

我在 mysql 数据库中有一个类似任务的列表,还有一个 PHP 脚本,它一次取出 1 个任务并执行它。完成后,会将标志从pending更改为done

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

提前致谢!

最佳答案

一种可能的方法是:

  • 您可以将 flag 列的数据类型更改为 ENUM类型(如果还没有)。它将具有三个可能的枚举值:pendingin_processdone
  • 选择要执行的待处理任务时,请执行明确的 LOCK在 table 上;这样其他 session 就无法更新它。

代码示例:

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;

关于mysql - 确保 cron 作业不会重复执行相同的作业,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53019288/

相关文章:

php - 每分钟通过 CRON 发送电子邮件 - 我的方法可以改进吗?

php - 将计划的 XML 解析放入 SQL 数据库的最简单方法是什么?

c++ - 使用文件统计程序的执行次数

MySQL 和 phpMyAdmin 创建三向关系

java - Quartz 在特定时间启动并以特定时间间隔运行

C++/Tk如何执行一般的tcl代码?

c - 如何使用命令提示符运行 .exe 文件?

java - 如何在 hibernate 中处理多个 session 事务提交和回滚?

php - 如何使用 html 创建可分页网格

python - 如何在wxpython中传递字符'素数?