这是我的问题:
在我的数据库中,我有一个请求表,其中有一个状态字段。cronjob 每分钟运行一次,以“待定”状态查找每个请求。当它完成处理请求时,它将状态设置为“完成”。
有时,这个 cronjob 需要超过一分钟才能运行,因此有两个相同的 cronjob 正在运行。我需要确保他们不会处理相同的请求。
现在我正在这样做:
$requests = db_all($this->db->query('SELECT * FROM x__mx_request WHERE status="pending"'));
//few lines of code later
$this->db->query('UPDATE x__mx_request SET status="processing" WHERE id IN('.implode(',', $ids).')');
我选择它后将状态设置为处理,这也阻止其他脚本处理它,但是一个脚本是否可能选择所有请求,然后第二个脚本在第一个脚本将它们设置为处理之前选择所有请求?
我想要一种更安全的方式来做到这一点!
编辑:感谢您提供的出色答案,但我必须先实际尝试一下,然后才能将其标记为正确。