我有一个简单的设置来分配游戏中的对手。 基本上,如果matchID为零(值来自其他地方),则需要创建一个新匹配,并且它将在最后一个matchID记录上执行mysql选择,以确定是否有人在等待匹配。
要查看玩家是否在等待,我们可以看到teamB空间是否为零(未采用)。但是,如果teamB有一个值,则没有人在等待,并且必须使用此玩家创建一个新的匹配作为“团队A”。
代码如下:
if ($matchID == 0)
{
$teamBquery = $conn ->query("SELECT matchID,teamBID,teamAID FROM challengeMatches ORDER BY matchID DESC LIMIT 1 ");
$teamBarray = $teamBquery->fetch(PDO::FETCH_ASSOC);
$teamBID=$teamBarray[teamBID];
$matchID=$teamBarray[matchID];
$teamAID=$teamBarray[teamAID];
if ($teamBID == 0){
$newChallenge = $conn ->query ("UPDATE challengeMatches SET managerBID='$managerID', teamBID='$teamID',matchStatus=1 WHERE matchID='$matchID'");
}else{
$filler = 0;
$matchID = $matchID+1;
$newChallenge = $conn ->query ("INSERT INTO challengeMatches (matchID,managerAID,managerBID,matchStatus,teamAID,teamBID) VALUES ('','$managerID','$filler','$filler','$teamID','$filler')");
}
}
我作为一个非常缺乏经验的人担心的是,据我所知,在选择信息和更新信息之间会有一段延迟,因此技术上两个mysql选择可能会返回相同的matchID来使用。然后即使使用matchID + 1作为变量也存在风险,因为它可能与数据库中创建的自动增量matchID不同步。
我的恐惧是否已经建立,或者代码是如此之快以至于概率不值得担心?
如果我担心我该怎么办?
答案 0 :(得分:1)
你首先需要确定你是否真的需要一个解决方案来克服这个问题,时间间隔应该很小,除非你运行一个大型网站,选择两个matchId的可能性很小。
然而,您可以通过三个方面来改善这一点:
SELECT .. FOR UPDATE
或SELECT ... LOCK IN SHARE MODE