0

我有一个简单的设置,用于在游戏中分配对手。基本上如果 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 不同步。

我的恐惧是有根据的还是代码如此之快以至于概率不值得担心?

如果我应该担心我该怎么办?

4

1 回答 1

1

你首先需要确定你是否真的需要一个解决方案来克服这个问题,除非你运行一个庞大的站点,否则时间间隔应该很小,选择两个 matchId 的可能性很小。

但是,您实际上可以从三个方面进行改进:

  1. 锁定 - 查看SELECT .. FOR UPDATESELECT ... LOCK IN SHARE MODE
  2. 交易
  3. 重构数据库以首先使用限制实际更新,然后选择更新的范围
于 2013-03-19T10:39:51.207 回答