目录
1、msql5.7 InnoDB锁的分类
按照以下属性分类:
- 粒度:行锁、表锁
- 用法:乐观锁、悲观锁
- 类型/基本模式:共享锁、排他锁、意向锁、自增锁
- 算法:间隙锁、记录锁、临键锁、插入意向锁
2、行锁
1、共享锁(读锁):多个事务对于同一数据可共享一把锁,都能访问,不能修改。
加锁方式:
select * from student where id=1 LOCK IN SHARE MODE
释放方式:commit/rollback
2、排他锁(写锁):不能与其他锁共存,如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该数据行的锁(共享锁、排他锁),只有获取该数据行排他锁的事务才能对该数据行进行读取和修改。
加锁方式:
- 自动:delete/update/insert
- 手动:
select * from student where id = 1 FOR UPDATE
3、表锁
1、意向共享锁:事务准备加共享锁,必须先得到表的意向共享锁。
2、意向排他锁:事务准备加排他锁,必须先得到表的意向排他锁。
- 与行表的区别:
- 一个事务成功给一张表加上表锁的前提:没有其他任何事务已经锁定的该表中任何一行数据。
- 意向锁属于一类表锁,在本质上是提高加表锁效率的标志(类似于火车上厕所上的指示灯)。由数据引擎自己维护,用户无法手动操作。
eg:一个事务对student表中的一行数据加上共享锁,student表就会出现意向共享锁,标志着这个表中有共享锁,其他的事务再想给这个表加表锁的时候就不用进行全表扫描,提高的加表锁的效率。
- 问题:一个表中没有任何索引的时候,加行锁会造成锁表。
因为,行锁锁住的实际上是索引项。优先级从高到低依次是:
1、primany key(主键)
2、unique key --no null(唯一非空索引)
3、_rowid(隐藏的唯一标识符)
没有任何索引会进行全表扫描,将_rowid作为聚集索引(索引的逻辑顺序和数据的物理顺序一致),造成锁表。
4、区间定义
以ID的主键索引来划分数据的区间(图中箭头指向的为主键索引)
5、记录锁(Record Lock)
锁定记录
使用条件见下图:
6、间隙锁(Gap Lock)
锁定范围
使用条件见下图:
7、临键锁(Next-Key Lock)
锁定范围加记录(Next-Key Lock = Gap Lock + Gap Lock)
使用条件见下图: