请教大家一个问题
是这样 游戏 发新手卡
如何防止多个人同时领取一张卡?我现在是这样做的 在新卡的表 设置一个状态字段
 1为已经领取 0为未领 1个用户名字段
当用户领取的时候 update未领取的一条记录 同时将用户名update为领卡的用户这样多人同时领取的时候 会不会update同一条数据啊?有什么解决方案啊

解决方案 »

  1.   

    update的时候需要锁吧,这样别人同时update就会失败,但是我没有做过,呵呵
      

  2.   

    看你们运营的游戏多少和用户的多少.
    这些数据多.新手卡一般也会比较多.
    而且不同游戏的卡类型并不会都是新手卡,只是大部分是,还是有一部分不是.
    这点要考虑到.数据表最好两张,一张存储所有未领取的卡数据.
    依仗存储已领取的卡数据.
    因为数据比较多,那些已领取的就没必要和未领取的放在一起了,表数据太多会影响速度.
    而一般未领取的表操作的要多点.领的时候,直接随机查询出一条某游戏的某服务器的新手卡数据SELECT *
    FROM `tablename` AS t1 JOIN (SELECT ROUND(RAND() * ((SELECT MAX(kid) FROM `tablename`)-(SELECT MIN(kid) FROM `tablename`))+(SELECT MIN(kid) FROM `tablename`)) AS kid) AS t2
    WHERE t1.kid >= t2.kid
    ORDER BY t1.kid LIMIT 1;后面直接把未领取的着条数据删除.再和对的用户ID插入到已领取的表里去
      

  3.   

    新手卡没有ID吗?
    有唯一ID的话,多个用户同时更新时,你只要根据ID来更新就不会更新同一条数据了。
      

  4.   

    锁表
    LOCK TABLES 新卡表 WRITE
    update 新卡表 set 用户名=领卡人名
    UNLOCK Tables