mysql - 关于php开发抢购程序涉及到的问题
我有个疑虑,如果用户多并发怎么办呢,如果同一时刻有10个用户同时抢购并付款,怎么保证购买记录表中的购买总数不超过商品总价呢?
如果商品价值40,已经有36个人成功付款并购买,还剩下4个,这是又有10个用户都想抢剩下的4个名额,那就说有6个人是抢不到的,那么怎么控制呢?不让总数溢出···
谢谢各位啦~~
有人说是数据库加锁,不知道什么意思···
回复内容:
我没事做了个小程序,主要的功能是用户抢购商品,比如一个商品标价是40元,每个用户出1元,用户抢购记录的总数等于40,那么这个商品就关闭购买。
我有个疑虑,如果用户多并发怎么办呢,如果同一时刻有10个用户同时抢购并付款,怎么保证购买记录表中的购买总数不超过商品总价呢?
如果商品价值40,已经有36个人成功付款并购买,还剩下4个,这是又有10个用户都想抢剩下的4个名额,那就说有6个人是抢不到的,那么怎么控制呢?不让总数溢出···
谢谢各位啦~~
有人说是数据库加锁,不知道什么意思···
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
这种应用场景可以考虑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
锁是计算机协调多个进程或线程并发访问某一资源的机制,为了保证数据的一致性和有效性。
锁分为表锁、行锁还有页面锁,高并发的环境我推荐用行锁。
表级锁
开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低;适合查询操作较多
行级锁
开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。适合并发更新数据
页面锁
开销和加锁时间介于表锁和行锁之间;会出现死锁;锁定粒度介于表锁和行锁之间,并发度一般。
推荐阅读
-
mysql - 关于php开发抢购程序涉及到的问题
-
关于php微信订阅号开发之token验证后自动发送消息给订阅号但是没有消息返回的问题
-
关于用php连接mysql数据库的问题
-
关于PHP向MYSQL插入图片地址字符串的有关问题,请大家详解
-
《php和mysql web开发(原书第三版)》中创建CMS系统例子关于mysql的出错问题?
-
PHP程序开发中的中文编码问题(1)_PHP教程
-
关于PHP向MYSQL插入图片地址字符串的有关问题,请大家详解
-
关于PHP向MYSQL插入图片地址字符串的有关问题,请大家详解
-
一个关于php执行mysql语句的有关问题,头都快搞炸,求前辈
-
关于PHP和MYSQL的一个有关问题,需求解