数据库的锁主要用来保证数据的一致性的。MyISAM存储引擎只支持表锁,InnoDB存储引擎既支持行锁,也支持表锁,但默认状况下是采用行锁。mysql
1.按照对数据操做的类型分:读锁,写锁sql
注:读锁和写锁都是阻塞锁。数据库
2.按照数据操做的粒度:表锁,行锁,页锁bash
1.手动增长表锁并发
lock table 表名 [read|write],表名 [read|write]…优化
2.解锁ui
unlock tables;spa
3.查看哪些表被锁线程
show open tables;3d
1.读锁
create table lock_one(
 id int primary key auto_increment,
 col int
)engine=myisam;
insert into lock_one(col) values (1);
insert into lock_one(col) values (2);
insert into lock_one(col) values (3);
复制代码
下面咱们模拟两个用户,即两个线程链接数据库,开启两个xsheel窗口,链接到mysql:
lock table lock_one read;
复制代码
select * from lock_one;
复制代码
答案是能够的。
答案也是能够的。
例如,查询 users表:select * from users;
咱们发现是不能够查询其余表的,这是由于当前会话已经对lock_one表加上了锁,即当前线程锁住了lock_one表,只能够操做lock_one表,就不能够查询其余的表。
select * from users;
复制代码
update lock_one set col=66 where id=1;
复制代码
发现是不能够的,由于咱们对 lock_one表加了 读锁,因此是不能够 进行写操做的。
咱们发现是没有执行结果的,也就是说 正在等待更新,在阻塞等待中。由于咱们在会话1中对lock_one中增长了读锁,其余人只有读的操做,没有写的操做。
2.写锁
lock table lock_one write;
复制代码
select * from lock_one;
复制代码
咱们发现是能够的。
咱们发现是没有执行结果的,也就是说 处于阻塞状态。由于写锁是排它锁,其余用户线程不能够读取当前锁住的表,只有解锁以后 其余用户线程才能够执行select
select * from users;
复制代码
咱们发现是不能够的。道理和读锁的时候同样,当前会话已经对lock_one表加上了锁,即当前线程锁住了lock_one表,只能够操做lock_one表,就不能够查询其余的表。
答案确定是能够的。由于之和锁的表有关系,和其余表没有任何关系。
答案必定是能够的。由于会话1对lock_one表进行了写锁操做,也就是只能够写。
咱们发现是不能够的。由于写锁是排它锁,也就是只能够当前线程操做锁住的表,其余用户线程须要等到解锁以后才能够操做该表。
3.总结
1.查询指令
show status like 'table_lock%';
说明: