如何知道或数据库记录被删除

时间:2018-04-03 16:21:46

标签: laravel laravel-5

我同时开始一些php工作,每个人都需要做一份工作。这些作业写在数据库表中,当worker接受一个 - 它删除记录。我的代码:

$job = Job::first();
if (!empty($job) and $job->delete()==true) {
// so something
}

但问题是仍有一些工人同时执行同样的工作!怎么会发生这种情况?

更新

我正在使用Postgres数据库

2 个答案:

答案 0 :(得分:2)

尽管上述评论寻求更好的解决方案,但您应该能够以这种方式解决:

$job = Job::first();
if ($job && Job::where('id', $job->id)->delete()) {
    // do something else ...
}

说明:Job::where('id', $job->id)->delete()将删除具有给定ID的所有作业记录,并返回受影响记录的数量。这可以分别是01,或falsetrue。因此,如果您的数据库正确处理并发删除,这实际上应该可行。

答案 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();