深度解读MySQL意向锁的工作原理机制与应用场景
意向锁
意向锁的概念
意向锁是InnoDB自动添加的一种锁,不需要用户去干预。
是数据库中的一种表级锁,一个事务要给一个资源加锁时,必须要先获取到对应类型的意向锁之后,才可以给这个资源加上自己想要的共享锁或者排他锁(不论是行级还是表级的共享/排他锁,都是需要先获取到意向共享/排他锁)。
意向锁并不是真正的锁,而是为了协调事务对表中行的锁定请求而引入的一个概念。
意向锁业的两个类型
意向共享锁(Intention Shared Lock,IS锁): 表示事务有获取到表的表级或行级共享锁的意向。
意向排他锁(Intention Exclusive Lock,IX锁): 表示事务有获取到表的表级或行级排它锁的意向。
注意:获取意向锁只是表示事务有获取到共享锁和排它锁的意向意图,而不是表示获取了意向锁,就是实际锁定了任何行或表。
意向锁是互相兼容的,不会互斥。
说明案例
前提:
如果事务A需要修改user表的id(有索引)为 ‘1’ 的数据行,则事务A会给这行数据加上一个行级排他锁,和一个意向排他锁。
场景一:
此时如果事务B想修改user表的name(无索引)为 ‘张三’ 的数据行,则事务B就需要给user表加上表级排他锁,但是在获取表级排他锁之前,还需要获取意向排他锁,然后就发现已经有事务A获取了意向排他锁,则事务B可以直接阻塞等待了,不再需要往下尝试判断能否获取到表级排他锁。
意向锁通过这种前置判断的操作,很好的解决了行锁与表锁共存时的事务隔离性问题。
场景二:
此时如果事务B想修改user表的id(有索引)为 ‘2’ 的数据行,则事务B就需要先获取意向排他锁,虽然此时事务A已经持有了user表的意向排他锁,但是事务B仍旧可以去获取user表的意向排他锁,因为 意向锁是互相兼容的,不会互相排斥 (上文也有说到),获取到意向排他锁之后,再去判断id为2的数据行是否有共享锁和排他锁,发现没有,则事务B持有到user表id为2的数据行的行级排他锁。
总结
行表头为事务A已经获取的锁
列表头为事务B能否获取的锁
| 意向共享锁 | 意向排他锁 | 表级共享锁 | 表级排他锁 | 行级共享锁 | 行级排它锁 | |
|---|---|---|---|---|---|---|
| 意向共享锁 | 兼容 | 兼容 | 兼容 | 不兼容 | 兼容 | 不兼容 |
| 意向排他锁 | 兼容 | 兼容 | 不兼容 | 不兼容 | 不兼容 | 不兼容 |
| 表级共享锁 | 兼容 | 不兼容 | 兼容 | 不兼容 | 兼容 | 不兼容 |
| 表级排他锁 | 不兼容 | 不兼容 | 不兼容 | 不兼容 | 不兼容 | 不兼容 |
| 行级共享锁 | 兼容 | 额外讨论-1 | 兼容 | 不兼容 | 兼容 | 同行不兼容 不同行兼容 |
| 行级排它锁 | 额外讨论-2 | 额外讨论-1 | 不兼容 | 不兼容 | 同行不兼容 不同行兼容 | 同行不兼容 不同行兼容 |
额外讨论-1
事务A获取了 意向排他锁 ,事务B能否获取 行级共享锁 或 行级排他锁 需要继续往下去判断,判断事务A的排他锁是表锁还是行锁,
如果是表锁,则事务B不能再加行级共享锁;
如果是行锁,则继续判断事务B要加行级共享锁的行是否被事务A或其他事务加了行级排它锁,如果加了,则事务B不能再加行级共享锁,如果这一行没加行级排他锁,则事务B可以加上行级共享锁(行锁:同行不兼容,不同行兼容)。
额外讨论-2
事务A获取了 意向共享锁 ,事务B能否获取 行级排他锁 需要继续往下去判断,判断事务A的共享锁是表锁还是行锁,
如果是表锁,则事务B不能再加行级排他锁;
如果是行锁,则继续判断事务B要加行级排他锁的行是否被事务A或其他事务加了行级共享锁,如果加了,则事务B不能再加行级排他锁,如果这一行没加行级共享锁,则事务B可以加上行级排他锁(行锁:同行不兼容,不同行兼容)。

关注我,我将持续输出Java常用相关技术文章。
相关文章:
深度解读MySQL意向锁的工作原理机制与应用场景
意向锁 意向锁的概念 意向锁是InnoDB自动添加的一种锁,不需要用户去干预。 是数据库中的一种表级锁,一个事务要给一个资源加锁时,必须要先获取到对应类型的意向锁之后,才可以给这个资源加上自己想要的共享锁或者排他锁࿰…...
ZYNQ TCP 协议的远程更新 QSPI Flash
1 SDK直接少些Flash过程 ****** Xilinx Program Flash ****** Program Flash v2019.1 (64-bit)**** SW Build 2552052 on Fri May 24 14:49:42 MDT 2019** Copyright 1986-2019 Xilinx, Inc. All Rights Reserved.WARNING: Failed to connect to hw_server at TCP:127.0.0.1:3…...
告别繁琐粘贴,CleanClip Mac 版,让复制粘贴变得简单快捷!粘贴队列功能太强大了!
告别繁琐粘贴,CleanClip Mac 版,让复制粘贴变得简单快捷! CleanClip for Mac 📋 是一款专为Mac用户设计的高效剪贴板管理工具。它解决了传统复制粘贴过程中的繁琐问题,让你的工作流程更加顺畅和高效。 🔄…...
前端基础知识(HTML+CSS+JavaScript)
文章目录 一、HTML1.1 HTML 基础:1.1.1 HTML 的概念:1.1.2 认识 HTML 标签:1.1.3 HTML 文件基本结构:1.1.4 标签层次结构: 1.2 HTML 快速入门:1.3 HTML常见标签:1.3.1 标题标签:h1-h…...
算力服务器和GPU服务器的区别是什么?
随着互联网科技的快速发展,服务器的类型也变得多种多样了,今天小编就来为大家介绍一下算力服务器和GPU服务器还有他们之间的区别是什么? 算力服务器通常是指具有着较高计算能力的服务器,算力服务器一般都是用于处理大量的计算任务…...
获取Live2d模型
文章目录 1、 Live2D官方示例数据集(可免费下载)2、模之屋3、unity商店4、直接b站搜索5、youtube6、BOOTH完结 1、 Live2D官方示例数据集(可免费下载) 官方提供了一些 Live2D实例模型给大家下载使用 地址:https://ww…...
软考架构-层次架构风格
一、两层C/S架构 客户端和服务器都有处理功能。处理在表示层(客户端)和数据层(服务器)进行 二、三层C/S架构 将处理功能独立出来。表示层在客户机上,功能层在应用服务器上,数据层在数据库服务器上。 三…...
Unity射击游戏开发教程:(35)轰炸敌人
现在敌人和飞机已经慢慢地越来越有各自地地行为了,在本文中,我们将介绍如何创建一个具有以下行为的敌人: 飞机会来回弹跳。飞机将有 4 架无人机轰炸机围绕飞机旋转。无人机轰炸机会偶尔投下沿着屏幕传播的炸弹。如果炸弹击中玩家或在随机时间后就会爆炸。如果炸弹没有击中玩…...
【网络】高级IO——select版本TCP服务器
目录 前言 一,select函数 1.1.参数一:nfds 1.2.参数二: readfds, writefds, exceptfds 1.2.1.fd_set类型和相关操作宏 1.2.2.readfds, writefds, exceptfds 1.2.3.怎么理解 readfds, writefds, exceptfds是输入输出型参数 1.3.参数三…...
【C++】学完c语言后的c++基础知识补充!(命名空间、输入和输出、缺省函数、函数重载、引用、内联函数代替宏、nullptr代替NULL)
一. 命名空间 1. 定义 出现的意义:解决各种函数、关键词和类的名称冲突问题。 定义方式:namespace 命名空间的名字 { } (注意!}后面不加;) namespace 是关键词命名空间的…...
uniapp自定义导航栏以及页面加背景
如果想给uniapp的页面加背景图片的话,疯狂度了之后会发现uniapp中背景图片用本地图片不起效果,所以一般用网络路径,之后又会发现,页面如果直接加背景的话有可能会遇到页面内容不够,背景撑不满整个页面,如果…...
MacOS Sonoma(14.x) 大写模式或中文输入法下的英文模式,光标下方永远会出现的CapsLock箭头Icon的去除办法
如图,MacOS Sonoma(14.x) 大写模式或中文输入法下的英文模式下,光标下方永远会出现一个CapsLock箭头Icon。此Icon挡住视野,还容易误触导致切换大小写状态,带来的收益远远小于带来的困扰。 解决办法 打开终端,输入以下…...
C#基础(10)变长参数和参数默认值
前言 作为函数的补充知识点,我们已经学习了ref和out,接下来两节我们继续来讲函数相关的内容。本节则讲解变长参数和参数默认值。 函数语法 关键字:params public void PrintNumbers(params int[] numbers) {for 相关逻辑 } 注意 params…...
Vue转React开发经验分享——hooks写法如何触发react生命周期、如何触发数据更新?
背景:习惯了vue的写法,并且vue2和vue3都比较熟悉,在转react开发中,不停的思考react和vue框架的相似之处,以及vue中的写法在react里怎么替换。本文将组件更新或组件生命周期角度出发聊聊如何使用hooks触发生命周期&…...
算法入门-贪心1
第八部分:贪心 409.最长回文串(简单) 给定一个包含大写字母和小写字母的字符串 s ,返回通过这些字母构造成的最长的回文串 的长度。 在构造过程中,请注意 区分大小写 。比如 "Aa" 不能当做一个回文字符串…...
element-plus的面包屑组件el-breadcrumb
面包屑组件主要用来显示当页面路径,以及快速返回之前的页面。 涉及2个组件 el-breadcrumb 和el-breadcrumb-item, el-breadcrumb的spearator指定item的分隔符 el-breadcrumb-item的to和replace属性和vue-router的一致,需要结合vue_router一起使用 用法…...
推荐几个网盘资源站给大伙,找资源更方便
夸克网盘在当前已然成为极为主流的网盘之一,其功能体验堪称强大,不仅支持在线解压阅读,磁力离线等功能也十分出色。那么,究竟该如何寻找夸克资源呢?下面,我就来为大家分享几个堪称神级的夸克资源网站。 一、…...
【Qt】Qml界面中嵌入C++ Widget窗口
1. 目的 qml做出的界面漂亮,但是执行效率低,一直想找一个方法实现qml中嵌入c界面。现在从网上找到一个方法,简单试了一下貌似可行,分享一下。 2. 显示效果 3. 代码 3.1 工程结构 3.2 pro文件 需要添加widgets > QT quick …...
Python快速入门 —— 第五节:接口开发
第五节:接口开发 目标: 学习使用Flask框架开发简单的Web接口,实现对学生信息的增删改查,通过HTTP请求与应用交互。 内容: Flask简介: Flask是一个轻量级的Python Web框架,使用简单,扩展性强,适合快速开发Web应用。安装Flask: pip install flask创建Flask应用: fr…...
利用secureCRT向虚拟机发送文件(secureCRT安装使用教程)
链接: secureCRT 链接:https://pan.baidu.com/s/1CvNYzoBbLVkyYNFq7hrT0g 提取码:5974 链接: secureCRT安装使用教程 链接:https://pan.baidu.com/s/1Bbi7SqyJBere8G53BCYL5A 提取码:xjw1...
应用升级/灾备测试时使用guarantee 闪回点迅速回退
1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする
日语学习-日语知识点小记-构建基础-JLPT-N4阶段(33):にする 1、前言(1)情况说明(2)工程师的信仰2、知识点(1) にする1,接续:名词+にする2,接续:疑问词+にする3,(A)は(B)にする。(2)復習:(1)复习句子(2)ために & ように(3)そう(4)にする3、…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
大数据零基础学习day1之环境准备和大数据初步理解
学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 (1)设置网关 打开VMware虚拟机,点击编辑…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序
一、开发准备 环境搭建: 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 项目创建: File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...
