MySQL的行锁

2023-09-09  本文已影响0人  玖柒叁

锁的分类

image.png

行锁

记录锁
针对索引记录的锁定,锁加在索引上
间隙锁
索引之间的间隙、第一个索引之前的间隙、最后一个索引之后的间隙加锁
Next-key锁
一条记录的记录锁加上该记录前面的间隙锁

等值查找

对主键的等值查找(for update)

表上的意向排他锁(IX)

记录存在:next-key退化为记录锁(索引记录上的排他锁(X))
记录不存在:next-key退化为间隙锁

对非主键的唯一索引的等值查找(for update)

表上的意向排他锁(IX)
主键索引上的排他锁(X)

记录存在:next-key退化为记录锁(索引记录上的排他锁(X))
记录不存在:next-key退化为间隙锁

普通索引的等值查找(for update)

表上的意向排他锁(IX)
主键索引上的排他锁

记录存在:
该记录的next-key锁
该记录到下一行记录的间隙锁
记录不存在:退化为间隙锁
锁间隙主要是为了避免幻读

无索引的情况下的等值查找(for update)

表上的意向排他锁(IX)
主键索引上的所有记录和间隙加锁,相当于锁表了

范围查找

select * from test where id >= 8 and id < 9 for update
id=8的数据存在,id=9的数据不存在,8下面一行数据id=16

唯一索引的范围查找

1, next-key lock:(4,8]
2, 唯一索引退化:8上的记录锁
3, 范围查找,找到下一行id=16,间隙锁为(8,16]
4, 不满足id<9则退化为间隙锁(8,16)

普通索引的范围查找,不会退化

查看加锁情况

show engine innodb status

推荐一个B站的视频,讲的很好

MySQL行级锁实现

上一篇 下一篇

猜你喜欢

热点阅读