基于锁的粒度分类:行级锁,表级锁,页级锁,记录锁,间隙锁,临键锁
基于锁的状态分类:意向共享锁,意向排他锁。
共享锁:共享锁又称读锁,s锁,当一个事物为数据加上读锁后其他事物只能对该数据添加读锁,而不能对数据添加写锁,直到所有的读锁释放之后其他事务才能对其进行加持写锁,共享锁的特性主要是为了支持并发的读取数据,读取数据的时候不支持修改,避免出现重复读的问题。
排他锁:排他锁又称写锁 ,x锁,当一个事物为数据加上写锁时,其他请求将不能为数据加任何锁,直到锁被释放之后,其他事物才能对数据进行加锁。排他锁的目的是为了,在修改数据时,不允许其他人同时操作数据,也不允许其他人读取,避免了脏读,和脏数据的问题。
表锁:表锁是指上锁的时候锁住的是整个表,当下一个事物访问该表时,必须等前一个事物释放了锁才能对表进行访问。
行锁:行键是指上锁的时候锁住的是表的某一行或多行记录,其他事物访问同一张表时,只有被锁住的记录不能访问,其他的记录可正常访问。
记录锁:记录锁也算是行锁的一种,只不过记录锁的范围只是表中的某一条数据,记录锁是说事物在加锁后锁住的只是表的某一条记录,
精准条件命中,并且命中的条件字段是唯一索引。
加了记录锁之后数据可以避免数据在查询的时候被修改的重复读问题,也避免了在修改的事物未提交前被其他事物读取的脏读问题。
页锁:页锁是MySQL中锁中粒度介于行级锁和表级锁中的一种锁,表级锁速度快,但冲突多,行级锁冲突少,但速度慢,所以取了折衷的页级,一次锁定相邻一组记录。
间隙锁:属于行锁的一种,间隙锁是在事物加锁之后其锁住的是表记录的某一区间,当表的相邻ID之间出现空隙则会形成一个区间,遵循左开右闭原则。
临建锁:也属于行锁的一种,并且他是INNODB的行锁默认算法,总结来说就是记录锁和间隙的组合,临近锁会把查询出来的记录锁住,同时也会是把该范围查询内的所有间隙也会锁住,再之他会把相邻的下一个区间也会锁住。
意向排他锁:当一个事物试图对整个表进行排他锁之前,首先需要获得这个表的意向排它锁。
意向共享锁:当一个事物试图对进行加共享之前,首先需要获得这个表的意向排他锁。