对MYSQL表的多个同时请求

时间:2012-04-05 10:57:20

标签: php mysql ajax database locking

我有一个问题可能是你可以帮助我:

我有一个使用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 ???)? 谢谢!

1 个答案:

答案 0 :(得分:0)

我只会在您编写的INSERT语句中使用“INSERT IGNORE”。这意味着如果相同的结果已经可用,则不会再次插入。这可能偶尔会导致两个脚本几乎同时计算结果。但是,我不认为这将是一个真正的问题,因为这可能是非常罕见的,并且计算本身可能不会花很长时间(是吗?)无论如何。用于执行计算的任何MySQL查询也将从查询缓存中回答。

或者,您可以保留已在共享内存中计算的结果列表:(http://php.net/manual/en/book.shmop.php)并在您即将开始时引用此列表计算新结果。我个人认为这比仅依靠“INSERT IGNORE”要多得多,除非对你的应用程序来说每个结果只计算一次是至关重要的。