MySQL45讲之InnoDB加锁规则 – flowers[亲测有效]

MySQL45讲之InnoDB加锁规则 – flowers[亲测有效]本文介绍 MySQL InnoDB 的加锁规则,以及分析加锁时,一些需要注意的点。

MySQL45讲之InnoDB加锁规则 - flowers

前言

本文介绍 MySQL InnoDB 的加锁规则,以及一些需要注意的点。

总结

两个原则,两个优化,一个 bug:

原则1:加锁的基本单位是 next-key 锁,是一个前开后闭区间
原则2:查找过程中访问到的记录才会加锁

优化1:索引的等值查询,唯一索引加锁时,next-key 会退化为行锁
优化2:索引的等值查询,向右遍历时且最后一个值不符合时,最后一个 next-key 会退化为间隙锁

一个bug:唯一索引上的范围查询会访问到第一个不满足条件的值为止。

注意,以上的加锁规基于版本 MySQL 5.x <= 5.7.24,8.x <= 8.0.13

注意

1、lock in share mode 和 for update 的区别

使用 lock in share mode 上锁读时,可以进行索引覆盖,那么只会对覆盖索引树上锁,而不会对主键索引树上锁。使用 for update 上锁读时,系统认为接下来需要进行更新操作,所以会给符合条件的记录加上行锁。

这个指导我们,如果想用 lock in share mode 加读锁来避免记录被更新,那么需要避免索引覆盖的情况,否则通过主键索引还是可以修改记录。

2、使用 limit 可以减小加锁范围

当对 limit 数量的记录执行完操作后,将不再扫描后续的记录,也就不会再加锁。

3、虽然分析加锁区间用 next-key,但注意 next-key 是行锁和间隙锁的组合

看下图的事务流程:

死锁示例

你或许会疑问,session B 不是没有申请到 next-key 么。

是这样的,申请 next-key 分为两步,session B 首先申请 (5,10)的间隙锁,申请成功;然后申请 c=10 的行锁,阻塞,即申请 next-key 阻塞是阻塞在申请行锁的时候。因为 session B 申请了(5,10)的间隙锁,所以 session A 插入(8,8,8)阻塞。

参考

  • [1] 为什么我只改一行的语句,锁这么多

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/5831.html

(0)
上一篇 2023-04-23 09:30
下一篇 2023-04-23

相关推荐

  • Oracle数据泵不同用户导入导出(表级)[亲测有效]

    Oracle数据泵不同用户导入导出(表级)[亲测有效]先认识一个单词,schema:模式。 再来了解一个概念。 当创建一个用户的时候,会同时创建一个与用户同名的schema,这个schema的官方解释是对象的集合。 举个例子,比如说我就是一个用户,叫A,

    2023-05-27
    135
  • Druid入门(1)—— 快速入门实时分析利器-Druid_0.17[通俗易懂]

    Druid入门(1)—— 快速入门实时分析利器-Druid_0.17[通俗易懂]一、安装准备 本次安装的版本是截止2020.1.30最新的版本0.17.0 软件要求 需要 Java 8(8u92 +) 以上的版本,否则会有问题 Linux,Mac OS X或其他类似Unix的操作

    2023-01-27
    141
  • redis典型使用场景_使用场景图

    redis典型使用场景_使用场景图Redis常见使用场景 缓存、数据共享分布式、分布式锁、全局 ID、计数器、限流、位统计、购物车、时间线 Timeline、消息队列、抽奖、点赞、签到、打卡、商品标签、商品筛选、用户关注、推荐模型、排

    2023-05-22
    147
  • 以高反差保留

    以高反差保留高反差保留(High-Pass Retention)是一种图像处理技术,它在保留图像的细节同时去除低频细节,使得图像更加锐利。该技术可以应用于图像增强、降噪、边缘检测等领域,同时也是数字图像处理入门知识。

    2024-05-28
    60
  • Redis学习笔记——Redis基础介绍[通俗易懂]

    Redis学习笔记——Redis基础介绍[通俗易懂]因为肺炎病毒的原因,在家呆着实在无聊,干脆来看书。以往在工作中对redis也有使用。但是在跟人交流的时候被问及关于redis的相关知识总是感觉自己还不是很明白,干脆就系统性的学习并总结一下。 Red…

    2023-01-26
    150
  • 用Python编程,学习如何使用lower()函数

    用Python编程,学习如何使用lower()函数Python是一种高级编程语言,被广泛应用于各种领域,特别是数据分析和人工智能领域。在Python编程中,经常需要将字符串进行一些处理,比如大小写转化等操作,这时候就需要使用一些字符串函数。本文将介绍如何使用lower()函数,将字符串转化为小写字母。

    2024-06-05
    57
  • MySQL总结(八)数据库表与表之间的关系-详解

    MySQL总结(八)数据库表与表之间的关系-详解表与表之间的关系 1.表关系的概念 在现实生活中,实体与实体之间肯定是有关系的。比如:员工和部门,老师和学生等。那么我们在设计表的时候,就应该体现出表与表之间的这种关系。 表关系 描述 一对一 相对…

    2023-03-07
    157
  • docker hash_docker hbase

    docker hash_docker hbase前言: 本文主要讲述了如何使用Docker快速上手HBase,省去繁杂的安装部署环境,直接上手,小白必备。适合HBase入门学习及简单代码测试。 1. Docker 安装 参考地址: 支持常用的操作系

    2023-03-04
    171

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注