队列版本:think-queue2.0
驱动:Databa
在 push 操作时会出现 SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry '81' for key 'PRIMARY'
具体SQL:
INSERT INTO `ft_jobs` (`queue` , `payload` , `attempts` , `reserved` , `reserved_at` , `available_at` , `created_at` , `id`) VALUES (:data__queue , :data__payload , :data__attempts , :data__reserved , NULL , :data__available_at , :data__created_at , :data__id)
源代码中并没有 id :
protected function pushToDatabase($delay, $queue, $payload, $attempts = 0)
{
return $this->db->name($this->options['table'])->insert([
'queue' => $this->getQueue($queue),
'payload' => $payload,
'attempts' => $attempts,
'reserved' => 0,
'reserved_at' => null,
'available_at' => time() + $delay,
'created_at' => time()
]);
}原因是 其中 $this->db-> 在操作时把已经有的所有条件都添加其中并且在其它 方法操作 中也存在同样的情况 获取下一个任务生成的SQL为
SELECT * FROM `ft_jobs` WHERE `queue` = 'game' AND `reserved` = 1 AND `reserved_at` <= 1525945591 AND `queue` = 'game' AND `reserved` = 0 AND `available_at` <= 1525945651 ORDER BY `id` ASC LIMIT 1 FOR UPDATE可以看出 reserved 条件冲突,不能获取到数据,而无法执行下一个任务暂时解决办法:把所有数据库操作 $this->db-> 改为 Db::
请官方给出修复方案
最佳答案