php - 高并发抢单时,锁表的疑惑?
黄舟
黄舟 2017-04-11 10:31:02
[PHP讨论组]

在网上看到的一个例子,有点不是很理解。

 0)  
{  
    --$id;  
    mysql_query('UPDATE a SET id='.$id);  
}  
  
# mysql 解锁  
mysql_query('UNLOCK TABLES');  
疑惑:如果是锁表的话,其他用户就不能查询这个表了,只有解锁之后才能查询,那后面的人岂不是要等很久才能够查询了吗
黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(3)
黄舟

mysql

MyISAM引擎支持锁表,innodb支持行锁

对于一些较为严格的操作,都会采用事务,比如资金结算。但是采用事务一般很少会使用锁表,因为锁表太小题大做了,我也就是操作我的ID下的数据,结果吧别人的数据也给锁了,所以一般都会采用行锁,要使用行锁需要采用innodb,现在myisam已经被淘汰了,所以不要在考虑锁表了。

并发不大的情况,无论行锁还是锁表都不会让用户等待太久,除非你的数据太大,或者代码写的太烂。

如果并发比较大的情况,行锁也会很慢,因为用户太多,怎么轮都轮不到,针对这种情况一般采用队列。比如抢购,开始抢购的时候,所有下单的用户都会根据点击按钮的先后顺序安排到队列里,根据先进先出,逐个来处理数据,从而防止行锁产生的一系列问题。

迷茫

1.这么处理等着是应该的,否则就超卖了
2.等不了太久的,一共就100个商品,就100个人排队处理的,超过100后面直接就显示没货了就完事了
3.根据2,应该一次录入100+个用户信息进入一个用户池,其他人直接返回抢购失败就完事了,就这100多个人折腾就行了

迷茫

首先说明这种在MySQL中做锁表限制处理是不明智的。
限购一般都是在逻辑层做锁定处理,我知道的有两种方法
1.用redis或memcached做锁定处理
2.用队列实现

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号