• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

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

php 搞代码 4年前 (2022-01-23) 19次浏览 已收录 0个评论
文章目录[隐藏]

我现在有一个需求,一个数据表中已经预先插入了许多新手卡卡密,然后需要本站每个会员自行去领取。但是问题来了,如果在一个很短的时间段有很多人都去领取这个新手卡,怎么设计,才能不重复

回复讨论(解决方案)

1.如果随机发放的话在卡后面再加一个字段,默认标1,领取后标0
2.好的方法在设计的时候加入步长为1的自动增长字段ID,增加一个TMP字段默认为0
每次有人领取后TMP加1,当ID=TMP时领取完毕

1.如果随机发放的话在卡后面再加一个字段,默认标1,领取后标0
2.好的方法在设计的时候加入步长为1的自动增长字段ID,增加一个TMP字段默认为0
每次有人领取后TMP加1,当ID=TMP时领取完毕 但是如果在极短的时间内,有多个人同时申请领取的话,会不会出现一个新手卡被上个人领取了,但是还没来得及修改标记字段,然后下个人又过来了,这个新手卡又分配给另一个人了

这个问题是关于并发的问题,解决办法是加锁,sql加一个行级锁就行了。以前我也做过类似的,这个必须加锁,可以在数据库里加锁,可以在代码中对那函数加锁, 你可以去查一下类似数据库加锁的资料。

来4源gaodaimacom搞#代%码*网搞代gaodaima码写代码的时候可以先加步长加一后然后提取当前步长减一的数值…这样就是时间相同,也只有一个人能拿到卡,剩下一个人会显示请稍后再试

方法很多,可以参考一下乐观锁悲观锁那些

我新手,刚刚自己想的,可能在逻辑上会有漏洞..你还是查他们说的名词比较靠谱~

用一个字段记录卡是否已被使用,然后利用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{
// 执行卡已被使用处理
}


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:类似新手卡发放怎么防止重复
喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址