问题描述
PHP+MYSQL项目要实现一个预约功能,我的实现方式是把当天的预约提取出来存入一个memory类型的表,一般情况下一千条左右数据。然后每次访问时对这个表进行查询此时刻向前推五分钟内,有无未执行的预约之后执行。如执行成功则进行相应的标记。每次查询前会检查是否有当天的数据,如果没有,则对表进行清空操作。然后从其他表把当天数据查询出来插入memory类型的表。相关代码大概为://查询今天的数据条数:$forday = strtotime(date("Y-m-d", $timestamp));$havefresh = $DB->result("SELECT COUNT(`id`) FROM ".tname('freshtmp')." WHERE `forday` = $forday");if (empty($havefresh)) { //此条语句清空数据表 $DB->query("TRUNCATE TABLE ".tname('freshtmp')); //此处为从其他表查询出数据并组合成:$txt = (1,2,3,4),(1,2,3,4)......这样的格式 $DB->query("INSERT INTO ".tname('freshtmp')." (`houseid`, `uid`, `freshtime`, `forday`, `fangan`, `addtime`) VALUES $txt");//此处一般会一次性插入2000条左右的数据} else { //执行相应刷新操作}我的问题是:就上面这段代码,经常出现数据重复插入的情况,明明只有2000条数据,结果经常会出现表里成倍的插入数据,变成4000条或六千条。而且通过我记录的插入时间来看,几批数据多是相差一两秒。我分析可能是由于网站并发较大,第一次的语句没有执行成功时在间隔时间内另一个请求又执行了插入代码。但又实在想不出好的解决办法,特来请教,万分感谢!----区分下面的广告 问题补充:titanaly 写道
解决方案
mysql有锁表语句的,你可以直接调用LOCK TABLES。具体看看手册吧
解决方案二:
防止请求重复提交应该可以,在进入预约页面前生成一个token和当前用户绑定,然后在提交预约请求时先验证当前的token是否和用户绑定的token一致,不一致不提交请求,一致就解除user绑定的token并提交数据.或者你在数据库做唯一性约束