mysql - 关于php开发抢购程序涉及到的问题

 李辰1990 发布于 2022-12-01 04:55

我没事做了个小程序,主要的功能是用户抢购商品,比如一个商品标价是40元,每个用户出1元,用户抢购记录的总数等于40,那么这个商品就关闭购买。

我有个疑虑,如果用户多并发怎么办呢,如果同一时刻有10个用户同时抢购并付款,怎么保证购买记录表中的购买总数不超过商品总价呢?

如果商品价值40,已经有36个人成功付款并购买,还剩下4个,这是又有10个用户都想抢剩下的4个名额,那就说有6个人是抢不到的,那么怎么控制呢?不让总数溢出···

谢谢各位啦~~

有人说是数据库加锁,不知道什么意思···

3 个回答
  • update Item set count=count+1 where id=$id and count=$count;
    大致逻辑:
    try=0;
    while true do
    select * from item where id=1;
    if $count >=40 then close item; break end
    if ++try >10 then break end
    update item count=count+1 where id=$id and count=$count;
    if update ok then
    xxxx
    break;
    end
    end

    2022-12-01 04:57 回答
  • 这种应用场景可以考虑memcache或redis。
    mysql高并发下就得使用锁机制了。
    InnoDB引擎,该引擎支持行锁,支持事务,外键。
    可以使用 for update 来共享锁,结合事务如下。
    begin;
    select price from good where id=1 for update;//查询当前商品的价格 for update 一定要加上
    然后判断是否达到40
    没有达到40执行

    update good set price=price+1 where id=1
    最后(再提交之前 你再开一个mysql客户端 来操作这条数据 你会发现一直在等待锁解除)
    commit

    达到的话就回滚终止

    rollback
    2022-12-01 04:57 回答
  • 锁是计算机协调多个进程或线程并发访问某一资源的机制,为了保证数据的一致性和有效性。
    锁分为表锁、行锁还有页面锁,高并发的环境我推荐用行锁。

    表级锁

    开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;适合查询操作较多

    行级锁

    开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。适合并发更新数据

    页面锁

    开销和加锁时间介于表锁和行锁之间;会出现死锁;锁定粒度介于表锁和行锁之间,并发度一般。

    2022-12-01 04:57 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有