0

ゲームで対戦相手を割り当てるための簡単な設定があります。基本的に、matchIDがゼロ(値は他の場所からのもの)の場合、新しい一致を作成する必要があり、最後のmatchIDレコードに対してmysql selectを実行して、一致を待機している人がいるかどうかを確認します。

プレーヤーが待機しているかどうかを確認するために、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')");

    }
}

かなり経験の浅い人としての私の懸念は、私が見る限り、情報の選択と情報の更新の間に遅延があり、技術的には2つのmysqlselectが使用される同じmatchIDを返す可能性があることです。また、matchID + 1を変数として使用する場合でも、データベースに作成された自動インクリメントのmatchIDと同期していない可能性があるため、リスクがあります。

私の恐れは根底にあるのでしょうか、それともコードが速すぎて確率を心配する価値がないのでしょうか?

心配な場合はどうすればよいですか?

4

1 に答える 1

1

最初に、これを克服するためのソリューションが本当に必要かどうかを特定する必要があります。2 つの matchId を選択する可能性がほとんどない大規模なサイトを運営していない限り、時間のギャップは非常に小さいはずです。

ただし、これを改善するために確認できる領域が実際には 3 つあります。

  1. ロック -SELECT .. FOR UPDATEまたはを見てくださいSELECT ... LOCK IN SHARE MODE
  2. 取引
  3. 最初に制限付きで実際に更新するようにデータベースをリファクタリングし、次に更新された範囲を選択します
于 2013-03-19T10:39:51.207 に答える