当前位置: 首页 > news >正文

深度解读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常用相关技术文章。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 简单比较 http https http2,我们要如何把http升级为https
  • 科研绘图系列:R语言宏基因组PCoA图(PCoA plot)
  • 常见 Mermaid 图表类型的 prompt 编写
  • Github 2024-09-13 Java开源项目日报 Top10
  • SpringBoot用kafka.listener监听接受Kafka消息
  • 计算机图形系统发展的前世今生
  • 计算机毕业设计 基于SpringBoot的课程教学平台的设计与实现 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
  • 【深度学习】【onnxruntime】C++调用onnx
  • 三维动画|创意无限,让品牌传播更精彩!
  • 2024年第十五届蓝桥杯青少组国赛撞期GESP认证、放弃那个?
  • C语言:刷题日志(3)
  • Golang | Leetcode Golang题解之第393题UTF-8编码验证
  • 【系统架构设计师-2015年】案例分析-答案及详解
  • 使用Azure+C#+visual studio开发图像目标检测系统
  • 《黑神话.悟空》与人工智能AI重塑经典与探索未来的交织
  • 2018一半小结一波
  • 2019.2.20 c++ 知识梳理
  • centos安装java运行环境jdk+tomcat
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • Java知识点总结(JDBC-连接步骤及CRUD)
  • JSDuck 与 AngularJS 融合技巧
  • js对象的深浅拷贝
  • 百度地图API标注+时间轴组件
  • 读懂package.json -- 依赖管理
  • 构建二叉树进行数值数组的去重及优化
  • 前端代码风格自动化系列(二)之Commitlint
  • -- 数据结构 顺序表 --Java
  • 微信支付JSAPI,实测!终极方案
  • 一道面试题引发的“血案”
  • 一个JAVA程序员成长之路分享
  • 用element的upload组件实现多图片上传和压缩
  • 你对linux中grep命令知道多少?
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • ​学习一下,什么是预包装食品?​
  • ### RabbitMQ五种工作模式:
  • #AngularJS#$sce.trustAsResourceUrl
  • #include
  • #pragma pack(1)
  • #QT(一种朴素的计算器实现方法)
  • $HTTP_POST_VARS['']和$_POST['']的区别
  • (06)金属布线——为半导体注入生命的连接
  • (19)夹钳(用于送货)
  • (4)通过调用hadoop的java api实现本地文件上传到hadoop文件系统上
  • (第一天)包装对象、作用域、创建对象
  • (二)Eureka服务搭建,服务注册,服务发现
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理第3章 信息系统治理(一)
  • (三)Honghu Cloud云架构一定时调度平台
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (自用)网络编程
  • *ST京蓝入股力合节能 着力绿色智慧城市服务
  • .JPG图片,各种压缩率下的文件尺寸
  • .NET 4.0中使用内存映射文件实现进程通讯