一些带有PHP条件的MySql查询
背景: 我想匹配PHP Webapp中的用户。 当用户进入特定页面时,他将被放入虚拟池。 池的实现如下表所示:一些带有PHP条件的MySql查询,php,race-condition,Php,Race Condition,背景: 我想匹配PHP Webapp中的用户。 当用户进入特定页面时,他将被放入虚拟池。 池的实现如下表所示: "search-table": id|userId|parameter 每个用户都在检查该表中是否还有其他用户准备匹配。(ready to match=相同参数)。检查是通过每x秒向我的PHP控制器发送一个AJAX请求来完成的。(AJAX请求会一直重复,直到找到匹配项,或者用户离开) 如果此查询返回有效的合作伙伴用户标识,则annother查询应执行对第二个表的插入 "matchin
"search-table": id|userId|parameter
每个用户都在检查该表中是否还有其他用户准备匹配。(ready to match=相同参数)。检查是通过每x秒向我的PHP控制器发送一个AJAX请求来完成的。(AJAX请求会一直重复,直到找到匹配项,或者用户离开)
如果此查询返回有效的合作伙伴用户标识,则annother查询应执行对第二个表的插入
"matching-table": id|firstUser|secondUser
插入后,应删除匹配用户的两个“搜索表”条目
如何保证不会有“同一用户的两个插入”,因为一些用户同时执行“检查”查询?->比赛条件
例如:
UserA、userB和UserC在“搜索表”中。
-UserA:他的AJAX请求返回UserC
-UserB:他的AJAX请求也返回userC
-UserA:使用firstUser=UserA和secondUser=UserC在“匹配表”中创建insert
-UserB:也会在“匹配表”中创建一个insert,但是使用firstUser=UserB和secondUser=UserC
-UserA:删除带有“UserA”和“userC”的“搜索表”条目
=>UserB应该不能创建插入,因为UserA已经选择了UserC
我怎么能意识到这一点?
我的实际代码是:
try
{
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$dbh->beginTransaction();
$stmt = $dbh->prepare("SELECT id FROM [...]");
$stmt->bindParam(1, [...]);
if($stmt->execute())
{
if($row = $stmt->fetch())
{
$matchID = $row['id'];
//check if parameter/id is ok
$checkD = $this->checkId($matchID);
if($checkD)
{
return '-1';
}
else
{
//Create entry in "matching-table"
$stmt = $dbh->prepare("INSERT INTO [...]");
$stmt->bindParam(1,[...]);
$stmt->execute();
//Delete Users from "serach-table"
$stmt = $dbh->prepare("DELETE [...]");
$stmt->bindParam(1,[...]);
$stmt->execute();
$dbh->commit();
return $matchID;
}
}
else
{
return '-1';
}
}
else
{
return '-1';
}
} catch(Exception $e)
{
$dbh->rollBack();
return '-1';
}
当用户从“搜索表”中获得有效结果并希望创建“匹配表”条目时,如何“锁定”该表?这样其他用户就不能创建该条目了?提示。在选择和插入之间插入睡眠(30)。这样,您就可以手动测试解决方案。的可能副本