2012-04-05 2 views
0

У меня есть проблема, может быть, вы можете мне помочь:Несколько одновременных запросов к MYSQL таблице

У меня есть несколько запросов, используя Ajax для моего PHP функции, например, в 10-00.

Моя функция PHP файл:

public function calculate(){ 
    $result = DB::query('SELECT * FROM `results` WHERE `time` > DATE_SUB(NOW(), INTERVAL "25" SECOND) ORDER BY `gameid` DESC LIMIT 1'); 
    if (intval($result->num_rows) > 0) { 
    return json_decode($result->fetch_object()->data); 
    } else { 

     /*RESULT CALCULATION CODE /*SELECT FROM `players`....*/ 

     $publish_date = date("Y-m-d H:i:s"); 
    $result = DB::prepare("INSERT INTO `results` (`data`, `time`) VALUES (?,?) ON DUPLICATE KEY UPDATE `data` = VALUES(data), `time` = VALUES(time)");  
    $result->bind_param("ss", json_encode($arr), $publish_date); 
    $result->execute();  
    $result->close(); 

    DB::query('TRUNCATE TABLE `players`'); /*WE CLEAN TABLE HERE*/ 
     return $arr; 
    } 
} 

Так один из моих запросов клиентов должен рассчитать результаты и хранить его в таблице results на первом.

Другие запросы должны получить информацию от results таблица без новых вычислений. Как я могу решить эту проблему (LOCK TABLE ???)? Спасибо!

+0

Попробуйте ВСТАВИТЬ, если INSERT не сработает (с уникальным ключом), тогда кто-то избил нас, поэтому SELECT. –

ответ

0

Я бы просто использовал «INSERT IGNORE» в инструкции INSERT, которую вы написали. Это означает, что если тот же результат уже доступен, он больше не будет вставлен. Это может иногда приводить к двум сценариям, вычисляющим результат почти одновременно. Тем не менее, я не думаю, что это будет реальной проблемой, так как это, вероятно, будет очень редко, и сам расчет, вероятно, не займет много времени (не так ли?). Любые MySQL-запросы, используемые для выполнения расчета, также будут получены из кеша запросов.

В качестве альтернативы вы можете сохранить список результатов, которые уже вычисляются в общей памяти: (http://php.net/manual/en/book.shmop.php) и ссылаться на этот список, когда вы собираетесь начните вычислять новый результат. Я лично считаю, что это будет гораздо больше работы, чем просто полагаться на «INSERT IGNORE», если только для вашего приложения не важно, чтобы каждый результат был рассчитан только один раз.

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