我有一个名为 cronjobs 的 MySQL 表,它包含每个需要的 cronjob 的完整信息(例如删除旧电子邮件、更新个人资料年龄等)。对于每个 cronjob 都有一个定义的代码块,如果 cronjob 到期(我对不同的 cronjobs 有不同的时间间隔),就会执行该代码块。
为了执行到期的 cronjobs,我得到了一个由 UNIX crontab 每分钟执行一次的 PHP 脚本(调用 execute_cronjobs_due.sh,它调用“php -f /path/to/file/execute_cronjobs_due.php”)。
当执行 execute_cronjobs_due.php 时,所有的 cronjobs 都会被标记为它们将被执行,因此另一个 execute_cronjobs_due.php 调用不会导致同一个 cronjob 的并行执行已经被执行。
现在的问题是:有时执行需要超过 60 秒,但 crontab 程序在这 60 秒后没有调用 execute_cronjobs_due.sh。实际发生的是 execute_cronjobs_due.sh 在执行前一个 crontab 之后立即被调用。如果一次执行时间超过 120 秒,接下来的两次执行将同时初始化。
时间线:
2015-06-15 10:00:00:执行 execute_cronjobs_due.sh(需要 140 秒)
2015-06-15 10:02:20:execute_cronjobs_due.sh 的两个同时执行
由于它是同时执行的,因此没有使用标记它们正在执行的 cronjob,因为选择(实际上应该排除标记的一次)是在完全相同的时间执行的。因此,更新发生在两者都已经选择了到期的 cronjobs 之后。
我该如何解决这个问题,以使 cronjobs 不会同时执行?我可以使用 MySQL 表锁吗?
非常感谢您提前提供的帮助,
弗雷德里克