高并发抢单时,锁表的疑惑?

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

<?php  
/** 
模拟秒杀活动-- 商品100件 
CREATE TABLE a 
( 
    id int comment '模拟100件活动商品的数量' 
); 
INSERT INTO a VALUES(100); 
模仿:以10的并发量访问这个脚本!    使用apache自带的ab.exe软件 
 */  
error_reporting(0);  
mysql_connect('localhost','root','admin123');  
mysql_select_db('test');  
  
# mysql 锁  
mysql_query('LOCK TABLE a WRITE');// 只有一个客户端可以锁定表,其他客户端阻塞在这  
$rs = mysql_query('SELECT id FROM a');  
$id = mysql_result($rs, 0, 0);  
if($id > 0)  
{  
    --$id;  
    mysql_query('UPDATE a SET id='.$id);  
}  
  
# mysql 解锁  
mysql_query('UNLOCK TABLES');  
疑惑:如果是锁表的话,其他用户就不能查询这个表了,只有解锁之后才能查询,那后面的人岂不是要等很久才能够查询了吗
阅读 5.7k
3 个回答

mysql

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

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

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

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

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

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题