Mysql中锁的类型有哪些?
- 1. 基于锁的属性分类:共享锁、排他锁
- 2. 基于锁的粒度分类:行级锁(INNODB)、表级锁(INNODB、MYISAM)、页级锁(BDB引擎)、记录锁、间隙锁、临键锁。
- 3.基于表的状态分类:意向共享锁、意向排他锁。
1. 基于锁的属性分类:共享锁、排他锁
- 共享锁
又称为读锁,S锁,当一个事务为数据加上读锁之后,其他事务只能对该时间加读锁,而不能对数据加写锁,知道所有读锁释放之后,其他事务才能对其进行加持写锁。共享锁的特性主要是为了支持并发的读取数据,读取数据的时候不支持修改,避免重复读取的问题。
- 排他锁
排他锁又称写锁,简称X锁,当一个事务为数据加上写锁的时候,其他事务不能对其加上任何锁。直到排他锁释放后,才能对数据进行加锁。排他锁的目的是在数据修改的时候,不允许其他人读取和修改,避免了脏数据的问题。
2. 基于锁的粒度分类:行级锁(INNODB)、表级锁(INNODB、MYISAM)、页级锁(BDB引擎)、记录锁、间隙锁、临键锁。
- 表锁
对整个表进行上锁,当下一个事务访问该表的时候,必须等待上一个事务释放了表锁,才能对其表进行访问。不会会出现死锁。
粒度大、加锁简单、容易冲突
- 页锁
页锁介于标所和行锁之间,表锁速度快,但是冲突多,行锁冲突少,但是速度慢。一次锁定一组数据,并发一般,会出现死锁。
- 行锁
锁住的是表中的一行或者多行记录,其他事务访问同一张表的时,只有被锁住的记录不能访问,其他的记录可以正常访问。会出现死锁。
粒度小,加锁比表锁困难,不易冲突,支持更高的并发
- 记录锁
行锁的一种,和行锁的不同是,只能锁某一行的记录,属于精准命中,命中字段为唯一索引。
粒度更小,加锁更困难,不易冲突,支持更高的并发。
- 间隙锁
对于键值在条件范围内但不存在的记录,叫做“间隙(GAP)”,InnoDB也会对这些“间隙”进⾏加锁,这种锁机制就是所谓的间隙锁(NEXT-KEY)锁。表记录的一个区间加锁。
- 临键锁
也是行锁的一种,总结说就是记录所和间隙锁的组合,临键锁会把查询出的记录锁住,并且吧范围查询内的所有间隙也锁住。
3.基于表的状态分类:意向共享锁、意向排他锁。
- 意向共享锁
当一个事务试图对整个表进行加共享锁之前,首先需要获取这个表的意向共享锁。
- 意向排他锁
当一个事务试图对整个表进行加排他锁之前,需要先获得这个表的意向排他锁。
当加了这样一个状态,就相当于,告诉其他事务,我已经对整个表进行了共享锁会这我排他锁。避免了对整个索引的每个节点扫描是否加锁,而这个状态就是意向锁。
如有错误欢迎指正