MySQL的锁有三种分类
1.基于锁的属性分类
共享锁,排他锁
1.共享锁(Share Lock):
共享锁,即读锁(又称S锁),当一个事务对数据加读锁时,其他事务只能对该数据加读锁,不能加写锁。直到所有的读锁释放之后才能在该数据上加写锁。 共享锁的出现,使得数据支持并发读取,读取数据时不可被修改,避免了可重复读的问题。
2.排他锁(Exclusive Lock):
排他锁,即写锁(又称X锁),当一个事务对数据加写锁时,其他事务不可对该数据加任何锁,直到该锁释放后其他事务才能对该数据加锁。 排他锁的出现,使得数据修改时,其他事务不可对该数据进行操作,避免了脏数据和脏读的问题。
2.基于锁的粒度分类
表锁,行锁,纪录锁,间隙锁,临键锁,页锁
1.表锁:
对整个表上锁,当其他事务访问该表时,只能等前一事务将表锁释放之后才能访问 表锁的上锁难度低,粒度大,容易冲突
2.行锁:
对表中的某一行或多行记录上锁,当其他事务访问该表时,只有被锁住的记录无法访问,其他的记录照常访问。 行锁的上锁难度高,粒度小,不容易冲突,比起表锁更支持并发。
3.纪录锁(Record Lock):
纪录锁属于行锁的一种,纪录锁的范围是某一条数据,且该数据是由精准条件命中,并且命中的条件字段是唯一索引。 加了纪录锁可以避免数据读取时被修改的重复读问题,以及修改的数据未提交事务时被其他事务读取的脏读问题。
4.间隙锁(Gap Lock):
间隙锁也属于行锁的一种,间隙锁锁的是范围,在范围内的数据无法插入。比如范围为id=(0,5),则你无法插入id分别为2、3、4的数据。
5.临键锁(Next-Key Lock):
临键锁也属于行锁的一种,实际上便是纪录锁加上间隙锁,形成左开右闭的区间。对此区间内的数据无法插入。
6.页锁:
介于行锁与表锁之间的锁,每次对相邻一组数据上锁。 开销和加锁时间介于行锁与表锁之间,会发生死锁;粒度介于行锁与表锁之间,并发度一般
3.基于锁的意愿分类
意向共享锁,意向排他锁
1.意向共享锁:
意向共享锁即告诉其他事务已经有事务在表中加了共享锁
2.意向排他锁:
意向共享锁即告诉其他事务已经有事务在表中加了排他锁