MySQL的锁有哪些

154 阅读2分钟

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.意向排他锁:

意向共享锁即告诉其他事务已经有事务在表中加了排他锁