1. MySQL的锁

1.1 共享锁

多个事务对数据可以读,但不可以写 select *from book where id=1 lock in share mode;//上共享锁

1.2 排它锁

排它锁是写锁,和共享锁不能同时存在 innodb行锁锁住的是索引,当条件列不是索引的时候就会给整张表上锁。

1.3 临键锁

image.png

InnoDB 中行级锁是基于索引实现的,临键锁只与非唯一索引列有关,在唯一索引列(包括主键列)上不存在临键锁 锁住的是一段左开右闭的区间的数据。

1.4 间隙锁

image.png

条件:记录不存在 间隙锁基于非唯一索引,间隙锁锁住的是一个区间

1.5 记录锁

image.png

对精准查询出来的一条记录进行上锁 基于唯一索引/主键索引

2. 隔离级别和锁

脏读:脏读可以用排它锁解决,当给这条数据上锁之后,其他的事务就不能操作这条数据,直到这条数据提交或者回滚。 可重复读:可重复读可以用共享锁解决,其他事务就不能对该数据进行写操作了。 幻读:幻读可以用临键锁解决,给查询的范围上锁,就无法再这个范围内插入。