我同时开始一些php工作,每个人都需要做一份工作。这些作业写在数据库表中,当worker接受一个 - 它删除记录。我的代码:
$job = Job::first();
if (!empty($job) and $job->delete()==true) {
// so something
}
但问题是仍有一些工人同时执行同样的工作!怎么会发生这种情况?
更新
我正在使用Postgres数据库
答案 0 :(得分:2)
尽管上述评论寻求更好的解决方案,但您应该能够以这种方式解决:
$job = Job::first();
if ($job && Job::where('id', $job->id)->delete()) {
// do something else ...
}
说明:Job::where('id', $job->id)->delete()
将删除具有给定ID的所有作业记录,并返回受影响记录的数量。这可以分别是0
或1
,或false
和true
。因此,如果您的数据库正确处理并发删除,这实际上应该可行。
答案 1 :(得分:0)
很简单---这是一种竞争条件。
为了避免这种情况,您需要实现某种数据库锁定。你没有说明你正在使用什么数据库,所以我假设你正在使用MySQL。
您的select语句需要锁定您选择的行。在MySQL中,您可以使用
执行此操作DB::beginTransaction();
// Queries you need to make with eloquent
SELECT * FROM queue LIMIT 1 FOR UPDATE;
// use id if you got a row. If not just commit immediately.
DELETE FROM queue WHERE id = $id;
DB::commit();