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)

大家都在看

  • 【Java基础】 — Java遍历List四种方法的效率对比 【转载】

    1.遍历方法简介 Java遍历List的方法主要有四种: *for each *Iterator *loop without size *loop with size 注:这里我们…

    数据库 2023年6月6日
    0114
  • qt项目设置程序图标

    一、下载好.ico格式的图标文件并存放到项目的根目录这里附赠一个png,jpg等格式转为ico格式的网站 二、在.pro文件里面添加ico的名字 三、发现在debug模式下运行项目…

    数据库 2023年6月6日
    081
  • 数据库操作

    数据库操作 数据库基础数据库是一种 存储结构, 允许使用各种格式 输入、处理、检索 数据,且不用在每次需要数据时 重新输入数据。 select 语句: select语句 用于查询数…

    数据库 2023年6月16日
    094
  • TortoiseGit的下载以及配置

    TortoiseGit 人称 _小乌龟插件_是一个来源的版本控制客户端,和 git功能类似, 不过相对于git支持界面操作. TortoiseGit下载地址: 点我下载 当前稳定版…

    数据库 2023年6月16日
    077
  • MySQL45讲之保证高可用

    本文主要介绍 MySQL 主备延迟,延迟产生的原因和主备切换策略。 主备延迟 主备同步过程中主要有三个时间点: [En] There are three main time poi…

    数据库 2023年5月24日
    066
  • Ubuntu 服务器安装 MySQL 远程数据库

    在 Web 项目中,我们需要使用到远程数据库,开发阶段也需要连接并查看数据库的状况。腾讯云、阿里云等云平台提供了远程数据库,可直接使用;当然也可以自己在部署 Web 的服务器上安装…

    数据库 2023年5月24日
    062
  • Java根据Freemarker模板生成Word文件

    准备模板 模板 + 数据 = 模型 1、将准备好的Word模板文件另存为.xml文件(PS:建议使用WPS来创建Word文件,不建议用Office) 2、将.xml文件重命名为.f…

    数据库 2023年6月14日
    086
  • 2_CSS

    1. 什么是CSS 1.1 什么是CSS Cascading Style Sheet 层叠样式表 是一种用来表现HTML(标准通用标记语言的一个应用)或XML(标准通用标记语言的一…

    数据库 2023年6月11日
    049
  • IDEA 常用插件

    插件使用参考:Idea插件系列 插件名称 说明 IDE Eval Reset 破解软件 Alibaba Java Coding Guidelines 阿里巴巴开发规范 tabnin…

    数据库 2023年6月6日
    080
  • MySQL系统变量和字符集

    书名《MySQL是怎样运行的:从根儿上理解MySQL》可自行百度 以下是知识点总结 重新认识Mysql MySQL是一个C/S架构的软件。 在Windows安装后首先注册成服务,然…

    数据库 2023年5月24日
    064
  • 设计模式之(6)——建造者模式

    定义:建造者模式也称为生成器模式,将一个个简单对象一步步构造成一个复杂的对象,将复杂对象的构建和它的表示分离,使得同样的构建过程有不同的表示; 主要解决:系统中复杂对象的创建过程,…

    数据库 2023年6月14日
    069
  • 达梦产品技术支持培训-day6-DM性能诊断与优化

    (本文只作为个人随笔用途,非官方文档,请勿作他用,谢谢) 1、DM8查询优化基本思路 1.1 操作系统性能诊断 linux常用系统监控命令 top 主要关注DMserver 的CP…

    数据库 2023年6月11日
    068
  • 在 Pisa-Proxy 中,如何利用 Rust 实现 MySQL 代理

    一、前言 背景 在 Database Mesh 中,Pisanix 是一套以数据库为中心的治理框架,为用户提供了诸多治理能力,例如:数据库流量治理,SQL 防火墙,负载均衡和审计等…

    数据库 2023年6月16日
    0125
  • [mybatis]快速搭建一个mybatis程序,实现对数据的增删改查

    MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。 MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。 MyBati…

    数据库 2023年5月24日
    079
  • Mysql_范式入门

    MySQL 三大范式 为什么需要数据规范化 信息重复 更新异常 插入异常 无法正常显示信息 删除异常 丢失有效的信息 设计关系型数据库时,遵从不同的规范要求,设计出合理的关系型数据…

    数据库 2023年6月11日
    079
  • Secret加密以及Configmapd配置介绍

    今天我们来了解有关Secret加密以及Configmapd配置介绍 一、Configmapd配置介绍 ConfigMap 功能在 Kubernetes1.2 版本中引入,许多应用程…

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