类似新手卡发放怎么防止重复

rinima6114 2014-02-26 10:20:38
我现在有一个需求,一个数据表中已经预先插入了许多新手卡卡密,然后需要本站每个会员自行去领取。但是问题来了,如果在一个很短的时间段有很多人都去领取这个新手卡,怎么设计,才能不重复
...全文
175 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
傲雪星枫 2014-03-01
  • 打赏
  • 举报
回复
用一个字段记录卡是否已被使用,然后利用mysql 的update 锁表来解决并发问题。 例如表结构为 id cardno cardpass used $sqlstr = "update table set used=1 where used=0 and cardno=xxxx"; mysql_query($sqlstr); $affected_rows = mysql_affected_rows(); if($affected_rows==1){ // 表示修改成功 // 执行使用成功处理 }else{ // 执行卡已被使用处理 }
joebnb 2014-02-26
  • 打赏
  • 举报
回复
我新手,刚刚自己想的,可能在逻辑上会有漏洞..你还是查他们说的名词比较靠谱~
Jim@luckeeinc.com 2014-02-26
  • 打赏
  • 举报
回复
方法很多,可以参考一下乐观锁悲观锁那些
joebnb 2014-02-26
  • 打赏
  • 举报
回复
写代码的时候可以先加步长加一后然后提取当前步长减一的数值...这样就是时间相同,也只有一个人能拿到卡,剩下一个人会显示请稍后再试
帆歌 2014-02-26
  • 打赏
  • 举报
回复
这个问题是关于并发的问题,解决办法是加锁,sql加一个行级锁就行了。以前我也做过类似的,这个必须加锁,可以在数据库里加锁,可以在代码中对那函数加锁, 你可以去查一下类似数据库加锁的资料。
rinima6114 2014-02-26
  • 打赏
  • 举报
回复
引用 1 楼 joebnb 的回复:
1.如果随机发放的话在卡后面再加一个字段,默认标1,领取后标0 2.好的方法在设计的时候加入步长为1的自动增长字段ID,增加一个TMP字段默认为0 每次有人领取后TMP加1,当ID=TMP时领取完毕
但是如果在极短的时间内,有多个人同时申请领取的话,会不会出现一个新手卡被上个人领取了,但是还没来得及修改标记字段,然后下个人又过来了,这个新手卡又分配给另一个人了
joebnb 2014-02-26
  • 打赏
  • 举报
回复
1.如果随机发放的话在卡后面再加一个字段,默认标1,领取后标0 2.好的方法在设计的时候加入步长为1的自动增长字段ID,增加一个TMP字段默认为0 每次有人领取后TMP加1,当ID=TMP时领取完毕

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧