MySQL45讲之InnoDB加锁规则

前言

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

总结

可重复读隔离级别下,两个原则,两个优化,一个 bug:

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

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

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

注意,以上的加锁规基于版本 MySQL 5.x

提交读隔离级别下,一个优化:语句执行过程中加的行锁,在语句执行完成后,会把不符合条件的行锁释放,不需要等待事务提交。

注意

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 是行锁和间隙锁的组合

看下图的事务流程:

MySQL45讲之InnoDB加锁规则

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

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

参考

Original: https://www.cnblogs.com/flowers-bloom/p/mysql45-lock-rule.html
Author: flowers-bloom
Title: MySQL45讲之InnoDB加锁规则

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/508110/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 启用Hyper-v后,重启后界面提示 无法完成功能配置,正在撤销更改

    安装docker后,提示需要启用hyper-v,在控制面板中勾选Hyper-v,然后重启,更新快完成就提示无法完成功能配置,正在撤销更改 解决方法 方法1 控制面板一个一个选 方法…

    数据库 2023年6月14日
    0125
  • 粗粒度服务的执行时间统计算法实现及问题推广

    3.1 算法一:逐一合并算法 3.1.1 算法描述 如图3.我们先将所有的时间片段按照起始时刻排序,后面的处理过程即依次判定相邻两个时间片段的三种关系,并将统计时间进行合并,合并的…

    数据库 2023年6月14日
    0110
  • Python语法糖,提升编程幸福感!!!

    转载请注明出处❤️ 作者:测试蔡坨坨 原文链接:caituotuo.top/a52bc938.html 大家好,我是测试蔡坨坨。 今天,我们来盘点一下Python中的那些语法糖。 …

    数据库 2023年6月11日
    0110
  • 《Unix环境高级编程》笔记

    基础 Unix操作系统体系结构 操作系统就是一种软件,它管理控制计算机的硬件资源,提供程序运行的环境,这种软件又被称为内核(Kernel)。内核提供的接口被称为系统调用(Syste…

    数据库 2023年6月11日
    0109
  • Linux下搭建git分布式管理

    VMware 虚拟机中搭建步骤 一、 1.查一下ip 2.和Xshell连接起来 3.看是否连接上 4.这就ok了 5.输入 yum install git yum install…

    数据库 2023年6月6日
    095
  • MySQL实战45讲 13

    13 | 为什么表数据删掉一半,表文件大小不变? 一个 InnoDB 表包含两部分,即: 表结构定义和 数据。 在 MySQL 8.0 版本以前, 表结构是存在以.frm 为后缀的…

    数据库 2023年6月16日
    0104
  • 【JDBC】编程(2)— 写一个JDBC工具类;用 JDBC工具类 实现模糊查询

    JDBC工具类 功能: 简化JDBC部分代码书写 import java.sql.*; public class DBUtil { /** * 工&#…

    数据库 2023年5月24日
    0105
  • Java基础六—Java集合框架Map

    HashMap HashMap使用hash数组+单链表实现,数组中的每个元素都是链表,由Node内部类实现,当链表长度超过8时,转化为红黑树。 HashMap实现了Map接口,即允…

    数据库 2023年6月6日
    079
  • Java8-Stream流

    Java8-Stream基础操作 JAVA技术交流群:737698533 在学习Stream之前必须有Lambda,的基础 Stream是Java8的新特性,可以进行对集合进行一些…

    数据库 2023年6月16日
    097
  • MySQL函数学习(四)—–聚合函数

    注:笔记旨在记录 四、MySQL 聚合函数 \ 函 数 名 称 作 用 完 成 1 MAX 求最大值 勾 2 MIN 求最小值 勾 3 COUNT 求数量 勾 4 BIT_COUN…

    数据库 2023年6月16日
    083
  • 数据库持久化+JDBC数据库连接

    数据持久化就是 将内存中的数据模型转换为存储模型,以及 将存储模型转换为内存中的数据模型的统称。数据模型可以是任何数据结构或对象模型,存储模型可以是关系模型、XML、二进制流等。 …

    数据库 2023年6月16日
    0126
  • Kafka集群部署

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    数据库 2023年6月16日
    080
  • Redisson

    ​ Redisson是架设在Redis基础上的一个Java驻内存数据网格(In-Memory Data Grid)。充分的利用了Redis键值数据库提供的一系列优势,基于Java实…

    数据库 2023年6月6日
    092
  • 0x02MySQL权限管理

    0x02MySQL权限管理 工具/原料 MySQL5728,centos7 方法/步骤 1.1 数据库的介绍 你们公司用了哪些数据产品? 请你例举一下你熟悉的数据库产品? 我们公司…

    数据库 2023年6月9日
    074
  • 猴子吃桃(递归)

    递归案例实践分析 猴子偷桃 题目描述: 猴子第一天摘下若干桃子,当即吃了一半,觉得好吃不过瘾,于是又多吃了一个,,第二天又吃了前天剩余桃子数量的一半,觉得好不过瘾,于是又多吃了一个…

    数据库 2023年6月16日
    0162
  • SpringBoot下使用AOP做日志

    AOP实现接口执行时间的计算: SpringBoot项目导入spring-boot-starter-aop依赖 编写切面类 类上加@Aspect注解,表明这是一个切面类 类上加@C…

    数据库 2023年6月14日
    0134
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球