我试图阻止用户在“同一时间”加入选择相同的可用管理员。PHP防止MySQL竞争条件
我在做什么是:
$conn->beginTransaction();
$sth = $conn->query("SELECT admin,room FROM admins WHERE live = 1 AND available = 1 ORDER BY RAND() LIMIT 1 FOR UPDATE");
$free_admin = $sth->fetch();
if (!empty($free_admin)) {
$conn->query("UPDATE admins SET available = 0 WHERE room = " . $free_admin['room']);
.
.
$conn->commit();
} else {
$conn->rollBack();
}
可惜这不是真正的工作。当流量很高时,许多用户最终会选择导致问题的相同免费管理员。
如何锁定SELECTED行,以便在任何其他用户可以读取它之前,只读一个用户来更新它?
您应该使用[bindValue/bindParam](https://secure.php.net/manual/en/pdostatement.bindvalue.php)查看绑定动态值以避免SQL注入。 – Chris
@Chris丫我会的,这段代码只是为了测试,以克服竞争条件问题 –
@ e4c5我不知道我理解你的问题。我想要做的是选择一个随机可用的管理员。如果有,请将其设置为不可用。这怎么能做得更好? –