多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
[TOC] # 表锁 建立测试表,并添加测试数据: ~~~ create table user( id int primary key auto_increment, name varchar(32) not null default '', age tinyint unsigned not null default 0, email varchar(32) not null default '', classid int not null default 1 )engine myisam charset utf8; insert into user values(null,'xiaogang',12,'gang@sohu.com',4), (null,'xiaohong',13,'hong@sohu.com',2), (null,'xiaolong',31,'long@sohu.com',2), (null,'xiaofeng',22,'feng@sohu.com',3), (null,'xiaogui',42,'gui@sohu.com',3); ~~~ 添加锁的语法: lock table table_name1 read|write 释放锁的语法:unlock tables ## 添加读锁 lock table user read; 另外一个用户登录后,不能执行修改操作,可以执行查询操作。 进行修改处于等待状态 **注意:添加读锁后,自己和其他的进程(用户)只能对该表查询操作,自己也不能执行修改操作。** **注意:添加表的锁定后,针对锁表的用户,只能操作锁定的表,不能操作没有锁定的表。** 执行释放锁,释放锁之后,另外的一个进程,可以执行修改的操作了 ## 添加写锁 只有锁表的客户可以操作(读写)这个表,其他客户读都不能读。 所以,写锁也叫做独占锁 或 排他锁 查看另外的一个用户,是否可以操作该表,其他的用户,读都不能读, | 锁 | 表锁 | | --- | --- | | 读锁 | (自己/别人 只读)(自己只能操作锁定的表) | | 写锁 | 自己可读可写 别人 无 | # 行锁 innodb存储引擎是通过给索引上的索引项加锁来实现的,这就意味着:只有通过索引条件检索数据,innodb才会使用行级锁,否则,innodb使用表锁。 要innodb的表支持行锁,必须添加主键 ~~~ alter table user engine innodb ~~~ 语法: begin; 执行语句; commit; 给当前用户添加行锁,另一个用户登录,其他行可以操作更改,当前行被锁定无法执行修改要等锁释放 # php代码 ~~~ mysql_query('lock table a write'); //添加写锁 //一系列操作 mysql_query('unlock tables'); //释放锁 ~~~ # 缺点 高并发下的商品库存用锁,有点保持库存正确 使用mysql里面锁机制缺点:就是阻塞,会阻塞拖慢整个网站的速度,一但锁定goods表(添加写锁,要更改库存),则其他进程就无法查询goods表