首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >Innodb加锁规则

Innodb加锁规则

作者头像
十毛
发布2021-07-27 14:41:13
发布2021-07-27 14:41:13
9230
举报

加锁顺序

普通select查询

  • 获取表级锁: MDL读锁
  • 不需要其他锁: 因为使用的是MVCC,所以不需要行锁 ps: 很多地方都说使用了MVCC就不需要加锁,实际上是不需要行锁,MDL读锁还是需要的

共享读select in share mode

  • 首先获取表级锁: MDL写锁
  • 再获取表级锁: 意向共享锁
  • 再获取行级锁: 根据不同语句获取对应的行锁和间隙锁

insert插入

  • 首先获取表级锁: MDL写锁
  • 再获取表级锁: 意向排它锁
  • 再获取行级锁: 插入意向锁

update/delete

  • 首先获取表级锁: MDL写锁
  • 再获取表级锁: 意向排它锁
  • 再获取行级锁: 根据不同语句获取对应的行锁和间隙锁

行锁加锁规则

两个“原则”、两个“优化”和一个“bug”

  • 原则 1:加锁的基本单位是 next-key lock。希望你还记得,next-key lock 是前开后闭区间。
  • 原则 2:查找过程中访问到的对象才会加锁。
  • 优化 1:索引上的等值查询,给唯一索引加锁的时候,next-key lock 退化为行锁。
  • 优化 2:索引上的等值查询,向右遍历时且最后一个值不满足等值条件的时候,next-key lock 退化为间隙锁。
  • 一个 bug:唯一索引上的范围查询会访问到不满足条件的第一个值为止。

锁冲突和兼容规则

  • MDL: MDL只与MDL存在冲突,读锁兼容读锁,写锁与读锁或写锁都不兼容
  • 意向锁规则: (IS 意向共享锁, IX意向排它锁, S共享锁, X排它锁)

\

IS

IX

S

X

IS

+

+

+

IX

+

+

S

+

+

X

  • 行锁规则: record lock行锁,gap lock间隙锁, insert intension lock间隙锁, next key lock(行锁+间隙锁)

加的锁\ 已存在的锁

record lock

gap lock

insert intention lock

next key lock

record lock

+

+

gap lock

+

+

+

+

insert intention lock

+

+

next key lock

+

+

参考

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 加锁顺序
    • 普通select查询
    • 共享读select in share mode
    • insert插入
    • update/delete
  • 行锁加锁规则
  • 锁冲突和兼容规则
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档