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

【mysql】锁机制 - 3.意向锁

意向锁(Intension Lock)

是为了提高粗粒度锁性能而设置的一种预判机制,即在一个操作发起实际资源的锁申请行为之前,先对更粗力度的资源发起一个加锁意向声明。

为什么需要意向锁?

比如对于以下操作:

事务1

事务2

Begin

Begin

Time1

SELECT * FROM test1 WHERE id = 1000 FOR UPDATE;
(获得第1000行的X锁)

Time2

LOCK TABLES test1 READ;
(等待获得表级S锁)

此时事务2 想要获得 test1 表的共享锁,需要保证:

  • 没有其他事务持有 test1 表的排他锁

  • 没有其他事务出游 test1 表中任意一行的排他锁

为了检测是否满足第2个条件,必须逐行扫描 test1 表是否存在行排他锁,显然这效率很差

意向锁机制

为了优化上述问题,mysql 引入了意向锁机制。意向锁是一种表锁,不与行级锁冲突,行级锁和表级锁可以共存。

意向锁分为两种:

  • 意向共享锁(IS):有意向对表中的一些行加 S 锁

  • 意向排他锁(IX):有意向对表中的一些行加 X 锁

意向锁之间的兼容性关系:

意向共享锁(IS)

意向排他锁(IX)

意向共享锁(IS)

兼容

兼容

意向排他锁(IX)

兼容

兼容

意向锁和普通锁的兼容性关系:

意向共享锁(IS)

意向排他锁(IX)

表级共享锁(S)

兼容

互斥

表级排他锁(X)

互斥

互斥

回到刚刚的例子:

事务1

事务2

事务3

Begin

Begin

Begin

Time1

SELECT * FROM test1 WHERE id = 1000 FOR UPDATE; 

(获得IX锁,获得第1000行的X锁)

Time2

LOCK TABLES test1 READ; 

(获得IS锁,等待表级S锁)

SELECT * FROM test1 WHERE id = 5 FOR UPDATE; 

(获得IX锁,获得第5行的X锁)

这时 test1 表存在两把锁:test1 表上的意向排他锁,id = 1000 数据行上的排他锁

事务2 会申请:

  • test1 表上的意向排他锁——检测到 test1 表上已存在其他的意向排他锁,但是意向锁和意向锁之间并不互斥,所以可以获得意向排他锁
  • test1 表上的共享锁——检测到 test1 表已经存在其他的意向排他锁,加锁请求直接被阻塞

事务3会申请:

  • test1 表上的意向排他锁——检测到 test1 表上已存在其他的意向排他锁,但是意向锁和意向锁之间并不互斥,所以可以获得意向排他锁

  • id = 5 数据行上的排他锁——由于此行上没有其他的排他锁(意向锁不会和行级锁冲突),所以可以获得排他锁

参考:

MySQL :: MySQL 8.0 Reference Manual :: 17.7.1 InnoDB Locking

https://juejin.cn/post/6844903666332368909


http://www.kler.cn/a/404417.html

相关文章:

  • 【分享一个vue指令】鼠标放置提示指令v-tooltip
  • 项目虚拟机配置测试环境
  • 实际开发中的协变与逆变案例:数据处理流水线
  • OBOO鸥柏车载广告屏:28.6寸液晶一体机的技术革新与应用前景
  • 存算分离的过去、现在和未来
  • 《TCP/IP网络编程》学习笔记 | Chapter 14:多播与广播
  • GPT-1.0、GPT-2.0、GPT-3.0参数对比
  • 本地maven添加jar包
  • 美畅物联丨智能分析,安全管控:视频汇聚平台助力智慧工地建设
  • PyTorch——从入门到精通:PyTorch基础知识(normal 函数)【PyTorch系统学习】
  • 【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,2-30
  • CSS中calc语法不生效
  • Android 从本地选择视频,用APP播放或进行其他处理
  • 缓冲区的奥秘:解析数据交错的魔法
  • C#(12) 内部类和分部类
  • 弹幕发送功能‘简单’实现
  • 数据集论文:面向深度学习的土地利用场景分类与变化检测
  • 设计模式-Adapter(适配器模式)GO语言版本
  • 2024信创数据库TOP30之达梦DM8
  • php:nginx如何配置WebSocket代理?
  • 接雨水
  • 智能工厂的设计软件 为了监管控一体化的全能Supervisor 的监督学习 之 序8 进化论及科学的信息技术创新:分布式账本/区块链/智能合约 之2
  • yolov5 数据集分享:纯干货
  • GEE 训练教程——Sentinel-1的卷积(核函数)的分析和可视化
  • this.$prompt 限制输入长度
  • Windows环境GeoServer打包Docker极速入门