在具有两个表usersapples的数据库中,我想为用户分配一个苹果,然后知道苹果ID。可以将多个苹果分配给一个用户。我在PHP中工作。

// users asks for an apple - lets find a vacant one
$apple_id = $dbh->query("SELECT id FROM apple WHERE user_id IS NULL LIMIT 1")->fetchColumn();

// hope fully we found an apple, lets assign it
$sth = $dbh->prepare("UPDATE apple SET user_id = ? WHERE apple_id = ?");
$sth->execute(array($user_id,apple_id));


问题在于,另一笔交易可能会选择同一个苹果,然后一个用户将另一个苹果覆盖。
如果我在更新语句中包括AND user_id IS NULL,则冒着无法得到苹果的风险。

我知道我可以只使用UPDATE apple SET user_id = ? WHERE user_id IS NULL,但是之后我将不知道Apple ID。

有没有办法获取更新行的主键?
lastUpdatedId这样的东西会很好。

但是我认为我必须使用交易。但是我必须选择哪个隔离级别?可重复阅读?可序列化?又为什么呢?这意味着什么?它会只锁定行还是整个表?

最佳答案

您可以执行以下操作:

update apple
    set user_id = if(@apple_id := apple_id, ?, ?)
    where user_id is null
    limit 1;

select @apple_id;

07-28 03:40
查看更多