2013-03-19 3 views
0

У меня есть простая настройка для назначения противников в игре. В принципе, если matchID равен нулю (значение исходит из другого места), необходимо создать новое соответствие, и он будет выполнять выбор mysql в последней записи matchID, чтобы убедиться, что кто-то ждет матча или нет.MySql: Как удалить задержку между SELECT и UPDATE

Чтобы узнать, ждет ли игрок, мы можем видеть, что пространство 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 + 1 как переменной является рискованным, потому что оно может быть не синхронизировано с идентификатором match-auto-increment, который создается в базе данных.

Являются ли мои страхи основаны или являются кодом так быстро, что вероятность не стоит беспокоиться?

Если я должен волноваться, что я могу сделать?

+0

Время, затрачиваемое на выполнение, зависит в первую очередь от вашего системного оборудования. Обычно для выполнения всего файла требуется ~ 1 микросекунда или менее. – hjpotter92

+0

@ Решите, поэтому я не должен волноваться? Я прочитал немного сегодня утром, с подобными запираниями/innodb, но кажется, что излишне. – Gamemorize

+1

Если вы хотите получить лучшие результаты, пусть MySQL сделает всю работу за вас. Используйте транзакции. – hjpotter92

ответ

1

Прежде всего вам необходимо определить, действительно ли вам нужно решение для преодоления этого, промежуток времени должен быть настолько мал, если вы не запустите массивный сайт, вероятность выбора двух matchId - удаленных.

Однако на самом деле есть три района вы можете посмотреть, чтобы улучшить это:

  1. блокираторов - посмотреть на SELECT .. FOR UPDATE или SELECT ... LOCK IN SHARE MODE
  2. Сделки
  3. реорганизовать базу данных на самом деле обновления с лимитом первым, а затем выберите обновленный диапазон
+0

Спасибо +1. Я не понял, что этот вопрос будет запрашивать «оценочные суждения» (потому что парсеры настолько быстр), я предположил, что я упростил код и создавал проблему позже. – Gamemorize

+0

@ Gamemorize нет ничего плохого в анализе того, что может случиться, когда вы пишете код, но иногда его слишком легко переусердствовать, что может привести к большим проблемам с производительностью в долгосрочной перспективе. Хорошая стратегия заключается в тщательном кодировании, профилировании запроса и решении проблем, которые действительно требуют вашего внимания. – Steve

Смежные вопросы