PHP防止MySQL竞争条件

时间:2016-09-26 14:15:26

标签: mysql pdo

我试图阻止用户在“同一时间”加入选择相同的可用管理员。

我在做的是:

$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行以便我可以读取它并在任何其他用户可以阅读之前仅由一个用户更新它?

1 个答案:

答案 0 :(得分:0)

在更新声明中,使用

 WHERE room = ... AND availabe = 1 

在查询之后,检查mysql affected_rows以验证您是否成功更改了可用性,如果没有,请重新启动。