<?php
 $over_time=time()+3600;
 $nowtime=time();
 $query=$db->query("select down_time from members where uid='1'");
 $down_time=$query->fect_assoc(); if($down_time['down_time']<$nowtime){
   $db->query("update members set down_time=$over_time where uid='1'");
   die('你成功得奖励!');
 }else{
   $latime=$down_time['down_time']-$nowtime;
   die("你已经领过奖励了,请等$latime分钟后再试!");
 }?>
这个判断有个问题,就是点得快一点后呢,可能就会给他两次以上的奖励。。主要看他的网络有多卡,我最多看到有给
8次奖励。有什么办法可以解决这个问题呢?

解决方案 »

  1.   

    是并发的问题,你需要使用锁来解决,或者使用事务如果你的表是INNODB的话。
      

  2.   

    begin transaction
    判断是否得过奖
    更新
    commit
      

  3.   

    事务。。我没有用那个。。郁闷。。也就是说,只能通过事务来解决?每个用户执行的时候,直接调用事务来处理,而不是用PHP去判断?那为了用事务,我是不是必须要把表转换成innodb?有没有别的方法?
      

  4.   

    你这个问题就好比图书馆网上借书系统有某本书只剩一本了,但是2个人同时去借这本书,同时去点借书的按钮,那有没有可能同时写入两条数据呢,这个要用事务和锁来解决,参考这篇文章:http://blog.csdn.net/ldb2741/archive/2010/02/25/5325161.aspx
      

  5.   

    对的,就是这个问题,那对于MyISAM来说,就是无解了。郁闷啊。。
      

  6.   

    在MYSQL的文档手册中查看 LOCK TABLES  命令的用法和用途。
    MySQL官方文档 http://dev.mysql.com/doc/refman/5.1/zh/index.html