美文网首页
MySQL的行锁

MySQL的行锁

作者: 玖柒叁 | 来源:发表于2023-09-09 22:40 被阅读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行级锁实现

    相关文章

      网友评论

          本文标题:MySQL的行锁

          本文链接:https://www.haomeiwen.com/subject/wrijvdtx.html