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

Mysql意向锁

这里写目录标题

  • 前置问题
  • 概念
  • 作用
  • 兼容互斥性
  • 总结

前置问题

首先我们需要问自己什么是意向锁?
为什么要有意向锁?
意向锁如何使用?

概念

mysql官网上对于意向锁的解释中有这么一句话
The main purpose of IX and IS locks is to show that someone is locking a row. or going to lock a row in the table.
意思是说加意向锁的目的是为了表明某个事务正在锁定一行或者将要锁定一行,简单概述就是要表明加锁的意图。

意向锁是一种不与行级锁冲突表级锁,这一点非常重要。意向锁分为两种:

意向共享锁(intention shared lock, IS):事务有意向对表中的某些行加共享锁(S锁) 代码解读复制代码-- 事务要获取某些行的 S 锁,必须先获得表的 IS 锁。
SELECT column FROM table ... LOCK IN SHARE MODE;

意向排他锁(intention exclusive lock, IX):事务有意向对表中的某些行加排他锁(X锁) 代码解读复制代码-- 事务要获取某些行的 X 锁,必须先获得表的 IX 锁。
SELECT column FROM table ... FOR UPDATE;

即:意向锁是有数据引擎自己维护的,用户无法手动操作意向锁,在为数据行加共享 / 排他锁之前,InooDB 会先获取该数据行所在在数据表的对应意向锁。

作用

我们从案例来理解需要意向锁存在的原因和作用。

事务A锁住了表中的一行,让这一行只能读,不能写。
之后,事务B申请整个表的写锁。
如果事务B申请成功,那么理论上它就能修改表中的任意一行,这与A持有的行锁是冲突的,数据库需要避免这种冲突,就是说要让B的申请被阻塞,直到A释放了行锁
数据库要怎么判断这个冲突呢?
step1:判断表是否已被其他事务用表锁锁表
step2:判断表中的每一行是否已被行锁锁住
注意step2,这样的判断方法效率实在不高,因为需要遍历整个表。
于是就有了意向锁。在意向锁存在的情况下,事务A必须先申请表的意向共享锁,成功后再申请一行的行锁。在意向锁存在的情况下,上面的判新可以改成
step1:不变
step2:发现表上有意向共享锁,说明表中有些行被共享行锁锁住了,因此,事务B申请表的写锁会被阻塞。
注意:申请意向锁的动作是数据库完成的,就是说,事务A申请一行的行锁的时候,数据库会自动先开始申请表的意向锁,不需要我们程序员使用代码来申请。

兼容互斥性

在这里插入图片描述

意向锁之间是相互兼容的,但是它会与普通的表级排他锁互斥,与普通的行级排他锁、行级共享锁是相互兼容的。

总结

意向锁是表锁,为了协调行锁和表锁的关系,支持多粒度(表锁与行锁)的锁并存。意向锁的存在是为了解决行锁与表锁共存时性能问题所产生的,是mysql内部存储引擎自己实现的不需要我们特地添加。


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

相关文章:

  • 高速光模块中的并行光学和WDM波分光学技术
  • K8S中的数据存储之基本存储
  • ray.rllib-入门实践-12:自定义多智能体强化学习
  • 头像生成小程序搭建(免费分享)
  • 基于神经网络的视频编码NNVC(1):帧内预测
  • 【2024年华为OD机试】(C卷,100分)- 约瑟夫问题 (JavaScriptJava PythonC/C++)
  • 深入解析 Linux 内核中的 InfiniBand 驱动接口:ib_verbs.h
  • 二叉树相关oj题 1. 检查两颗树是否相同。
  • 多线程详解——IntentService工作原理(源码详解)
  • PC端实现PDF预览(支持后端返回文件流 || 返回文件URL)
  • 【竞技宝】DOTA2:NAVI junior被ESL取消参赛资格
  • springfox-swagger-ui 3.0.0 配置
  • 无监督学习:聚类、异常检测
  • C++AVL树(二)详解
  • 港科夜闻 | 香港科大获三千万基金资助,开发人工智能英语评估及学习系统,供全港中学生免费使用...
  • PostgreSQL中级专家是什么意思?
  • AI问答:在后端开发语境中 VO 是什么 / Value Object / 值对象
  • 第12章 volatile关键字的介绍(Java高并发编程详解:多线程与系统设计)
  • Lua语言的图形用户界面
  • Vue3 插槽(Slots)用法总结
  • 一组开源、免费、Metro风格的 WPF UI 控件库
  • DBeaver下载安装及数据库连接(MySQL)
  • 初步理解数据结构
  • 每日一题 419. 棋盘上的战舰
  • GESP2024年6月认证C++六级( 第三部分编程题(2)二叉树)
  • react native i18n插值:跨组件trans