编辑
2024-09-02
后端技术
0
请注意,本文编写于 142 天前,最后修改于 122 天前,其中某些信息可能已经过时。

目录

行锁
间隙锁
临键锁

行锁(Record Lock):锁定单个行记录的锁,防止其他事务对此行进行update和delete。在RC、RR隔离级别下都支持。

间隙锁(Gap Lock):锁定索引记录间隙(不含该记录),确保索引记录间隙不变,防止其他事务在这个间隙进行insert,产生幻读。在RR隔离级别下都支持。

临键锁(Next-Key Lock):行锁和间隙锁组合,同时锁住数据,并锁住数据前面的间隙Gap。在RR隔离级别下支持。

行锁

针对唯一索引进行检索时,对已存在的记录进行等值匹配时,将会自动优化为行锁。InnoDB的行锁是针对于索引加的锁,不通过索引条件检索数据,那么InnoDB将对表中的所有记录加锁,此时就会升级为表锁。

间隙锁

间隙锁锁定的不是具体的行记录,而是两个索引之间(区间)的间隙,这样可以防止新的记录插入到该间隙,确保数据的一致性和事务的隔离性。

间隙锁的使用场景

1、防止幻读,防止其他事务在已经锁定的范围内插入新的数据行,从而避免幻读问题。

2、范围查询,在执行范围查询时,如果事务需要对查询结果进行更新或删除,间隙锁可以保证事务执行期间,不会有新的行插入到查询范围中。

3、防止死锁,防止两个事务同时试图在同一位置插入一个新行,导致彼此等待对方释放锁,形成死锁。

临键锁

一种特殊的间隙锁,通过临键锁可以解决幻读问题,每个数据行上的非唯一索引列上都会有一把临键锁,当某个事务持有该数据行的临键锁时,会锁住一段左开右闭区间的数据。在唯一索引列不存在临键锁。

本文作者:whitebear

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!