MySql:如何删除SELECT和UPDATE之间的延迟

时间:2013-03-19 10:12:17

标签: mysql

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

我的恐惧是否已经建立,或者代码是如此之快以至于概率不值得担心?

如果我担心我该怎么办?

1 个答案:

答案 0 :(得分:1)

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

然而,您可以通过三个方面来改善这一点:

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