【发布时间】:2015-04-08 07:56:15
【问题描述】:
在有两个表users 和apples 的数据库中,我想将一个苹果分配给一个用户,然后知道苹果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,但之后我就不知道苹果ID了。
有没有办法获取更新行的主键?
像lastUpdatedId 这样的东西会很好。
但我认为我必须使用事务。但是我必须选择哪个隔离级别?可重复阅读?可序列化?为什么?这意味着什么?它会只锁定行还是整个表?
【问题讨论】:
标签: php mysql sql pdo transactions