在网上看到的一个例子,有点不是很理解。
<?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');
疑惑:如果是锁表的话,其他用户就不能查询这个表了,只有解锁之后才能查询,那后面的人岂不是要等很久才能够查询了吗
mysql
MyISAM引擎支持锁表,innodb支持行锁
对于一些较为严格的操作,都会采用事务,比如资金结算。但是采用事务一般很少会使用锁表,因为锁表太小题大做了,我也就是操作我的ID下的数据,结果吧别人的数据也给锁了,所以一般都会采用行锁,要使用行锁需要采用innodb,现在myisam已经被淘汰了,所以不要在考虑锁表了。
并发不大的情况,无论行锁还是锁表都不会让用户等待太久,除非你的数据太大,或者代码写的太烂。
如果并发比较大的情况,行锁也会很慢,因为用户太多,怎么轮都轮不到,针对这种情况一般采用队列。比如抢购,开始抢购的时候,所有下单的用户都会根据点击按钮的先后顺序安排到队列里,根据先进先出,逐个来处理数据,从而防止行锁产生的一系列问题。