【问题标题】:php and mySQL database concurrency updatephp和mySQL数据库并发更新
【发布时间】:2016-06-12 19:00:24
【问题描述】:

假设我想在每次有人访问网页时增加数据库中的计数器。

名为“example”的数据库如下所示:

|名字.....|价值…………|身份证|

====================

|计数……| 5.................| 1 |

网页上的代码是这样的:

$db = mysqli_connect("localhost", ....);
$q = "SELECT Value FROM example WHERE id = '1'";
$r=mysqli_query($db, $q);
$result = mysqli_fetch_array($r);
$increment = $result[0] + 1;
$q = "UPDATE example SET Value = '$increment' WHERE id = '1'";
mysqli_query($db,$q);

如果两个人同时访问该网页,A 将获取 5 的值,然后,B 将立即获取相同的值。他们都会将其增加到 6,并在另一个输入 6 作为计数器值时一个接一个地执行更新,因为两个人访问了该页面,它实际上应该是 7。我怎样才能防止这种情况?

【问题讨论】:

  • 警告:当使用mysqli 时,您应该使用parameterized queriesbind_param 将用户数据添加到您的查询中。 不要使用手动转义和字符串插值或连接来完成此操作,因为如果您忘记正确转义某些内容,您将创建严重的SQL injection bugs

标签: php mysql database concurrency


【解决方案1】:

你可以在一个语句中做到这一点:

"UPDATE example SET Value = Value + 1 WHERE id = '1'";

所以在您的阅读和更新之间也没有其他任务可以改变它。

这里是你的脚本

$db = mysqli_connect("localhost", ....); $q = "更新示例 SET Value = Value + 1 WHERE id = '1'"; mysqli_query($db,$q);

【讨论】:

  • 没错。像这样的原子更新比只请求竞争条件的读/写周期要好得多。
  • 但行:mysqli_query($db,$q);仍然需要。如果 A 人执行更新行,而 B 人在此之后立即执行更新行,在 A 人运行下面的行之前,是否可能出现相同的情况?
  • @Jay - 如果你只使用更新,你的问题中的结果是 7
  • 我不明白你的评论。如果我不包括这一行: mysqli_query($db,$q);更新后,则更新不会显示在数据库中
  • @Jay - 是的,你必须执行 one mysqli_query($db,$q);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多