【发布时间】:2014-02-08 18:43:12
【问题描述】:
如果两个用户执行同一个php文件,是并行执行还是顺序执行?示例:
如果我有一个只有一列 id 的数据库 data,下面的代码是否有可能为两个不同的用户产生相同的结果?
1. $db=startConnection();
2. $query="SELECT id FROM data";
3. $result=$db->query($query)or die($db->error);
4. $zeile=mysqli_fetch_row($result);
5. $number=$zeile['id'];
6. $newnumber=$number+1;
7. echo $number;
8. $update = "UPDATE data Set id = '$newnumber' WHERE id = '$number'";
9. $db->query($query)or die($db->error);
10. mysqli_close($db);
如果不是并行执行,是不是意味着当100个人在加载一个加载时间为1秒的php文件时,其中一个必须等待99秒?
编辑:在 cmets 中说我可能会弄乱我的数据库,我想这就是它可能会搞砸的原因:
用户 A 从 1.-7 执行文件。此时用户 B 执行 1.-7 中的文件。然后 A 加载 8.-10。和 B 加载 8.-10。在这种情况下,两个用户将在屏幕上显示相同的数字。
现在让我们举个例子:
1. $db=startConnection();
2. $query=" INSERT INTO data VALUES ()";
3. $result=$db->query($query)or die($db->error);
4. echo $db->insert_id;
5. mysqli_close($db);
假设 A 从 1.-3 执行文件。此时用户 B 从 1.-5. 执行文件,之后用户 A 从 4.-5 加载文件。我想在这种情况下,屏幕上的数字也会相同,对吧?事务是否可以防止这两种情况?
【问题讨论】:
-
两者都不是,每个都在自己独立的线程中执行;但这不会阻止您的数据库访问混乱....这就是数据库实现自动递增 id 的原因...如果您自己尝试,存在竞争条件风险,数据库自动增量消除了这种风险
-
该代码可能并且将会为不同的用途产生相同的结果。要解决这个问题,请将您的查询包装在事务中
-
@MarkBaker 这是否意味着如果我调用插入查询,然后调用 $db->insert_id 我可以获得已在其他脚本中执行的不同插入查询的 id?
-
$db->insert_id保证正常工作并始终返回正确的 id 而没有跨任何数量的线程重复的风险,数据库为自动增量 id 干净地处理这个......它由数据库提供正是这个目的 -
@MarkBaker 你能在我编辑的帖子中查看我的例子吗?那不是insert_id也会失败的情况吗?
标签: php