03_意向锁

意向锁(Intention Lock)

文章目录

    • 意向锁(Intention Lock)
        • 简介
        • 类型
        • 原理
        • 意向锁加锁流程
        • 锁兼容矩阵
        • 使用场景
        • 示例
        • 总结
        • 扩展:意向锁和共享锁排他锁的加锁流程
          • 假设的场景和前提
          • 已加锁的情况
          • 新的加锁请求
          • 加锁流程
          • 锁的兼容性矩阵
          • 示例代码
          • 总结

文章目录

    • 意向锁(Intention Lock)
        • 简介
        • 类型
        • 原理
        • 意向锁加锁流程
        • 锁兼容矩阵
        • 使用场景
        • 示例
        • 总结
        • 扩展:意向锁和共享锁排他锁的加锁流程
          • 假设的场景和前提
          • 已加锁的情况
          • 新的加锁请求
          • 加锁流程
          • 锁的兼容性矩阵
          • 示例代码
          • 总结

简介

MySQL 中的意向锁(Intention Lock)是一种表级锁,用于帮助协调不同粒度的锁(行级锁和表级锁)之间的冲突,优化并发事务的锁管理。意向锁并不会实际阻止行的读写操作,而是用来表明事务接下来要在某些行上加锁,从而提高锁冲突检测的效率。


类型

MySQL 中主要有两种类型的意向锁:

  1. 意向共享锁(Intention Shared Lock, IS):事务计划在某些行上加共享锁。
  2. 意向排他锁(Intention Exclusive Lock, IX):事务计划在某些行上加排他锁。

原理

当一个事务请求获取一个行级锁或表级锁时,MySQL会自动获取相应的表的意向锁。 这样,其他事务请求获取表锁时,就可以先基于这个意向锁来发现是否有人加过锁,并根据该锁的类型(意向共享锁/意向排他锁)来判断自己是否可以获取锁。通过这种方式,当一个事务请求表级锁时,InnoDB 可以快速确定是否有任何行级锁冲突,而无需检查表中每一行的锁状态。

注意:

  • 意向锁并不是直接锁定资源,而是为了通知其他事务,以防止它们在资源上设置不兼容的锁。
  • 意向锁并不是直接由用户请求的,而是由 MySQL 管理的。

意向锁加锁流程
  1. 事务请求意向锁:事务发出加意向锁的请求(IS或IX)。
  2. 检查兼容性:MySQL 检查意向锁是否与当前表上的其他意向锁或表级锁兼容。如果兼容,则加锁成功。
  3. 后续加锁操作:事务在行级别上加共享锁或排他锁时,只需检查意向锁而无需检查整个表。
  4. 释放锁:事务提交或回滚后,释放意向锁。

锁兼容矩阵
ISIXSX
ISYesYesYesNo
IXYesYesNoNo
SYesNoYesNo
XNoNoNoNo
  • ISIS 是兼容的,可以同时存在。
  • ISIX 是兼容的,可以同时存在。
  • IXIX 是兼容的,可以同时存在。
  • SIS 是兼容的,可以同时存在。
  • SIX 以及 X 锁都是不兼容的。

使用场景

意向锁在以下场景中非常有用:

  • 高并发读写场景:在高并发读写操作中,意向锁减少了锁冲突检测的开销,提高了系统的并发性能。
  • 行级锁与表级锁混合使用:当事务需要在行级别加锁但可能会有其他事务请求表级锁时,意向锁有助于快速检测冲突。

示例

假设有一个表 orders,包含以下数据:

CREATE TABLE orders (id INT PRIMARY KEY,product_name VARCHAR(50),quantity INT
);
  1. 事务1

    START TRANSACTION;
    -- 请求在 orders 表上加意向排他锁
    SELECT * FROM orders WHERE id = 1 FOR UPDATE;
    
  2. 事务2

    START TRANSACTION;
    -- 请求在 orders 表上加意向共享锁
    SELECT * FROM orders WHERE id = 2 LOCK IN SHARE MODE;
    
  3. 事务3

    START TRANSACTION;
    -- 尝试加表级共享锁,会等待事务1和事务2释放意向锁
    LOCK TABLES orders READ;
    

在以上示例中:

  • 事务1在orders表上加了意向排他锁(IX)和行级排他锁(X)。
  • 事务2在orders表上加了意向共享锁(IS)和行级共享锁(S)。
  • 事务3尝试加表级共享锁(S),由于表上已有意向排他锁(IX),因此会等待事务1释放锁。

总结

**意向锁在 MySQL 中的作用是优化锁管理,减少锁冲突检测的开销,提升系统的并发性能。**它们在高并发读写场景和行级锁与表级锁混合使用场景中特别有用,通过表明事务的锁意图,使得锁冲突检测更加高效。

个人理解:

  • 意向锁本质还是共享锁和排它锁
  • 根据 SQL 要添加共享锁还是排它锁,MySQL 自动添加意向共享锁和意向排它锁
  • 意向锁是表级锁,且是 MySQL的自动添加的,人为不可控。

扩展:意向锁和共享锁排他锁的加锁流程

在 MySQL 中,如果一个事务已经对 table 表的 id=1 记录添加了行级排他锁(A),而此时另一个事务要对同一个表的 id=5 记录添加行级排他锁(B),加锁流程将涉及意向锁和排他锁的处理。以下是详细的加锁流程:

假设的场景和前提

假设表结构如下:

CREATE TABLE table (id INT PRIMARY KEY,value VARCHAR(50)
);
已加锁的情况
  • 事务 A 已经对 id=1 的记录添加了行级排他锁(X 锁)。
新的加锁请求
  • 事务 B 尝试对 id=5 的记录添加行级排他锁(X 锁)。
加锁流程
  1. 事务 B 请求意向排他锁(IX 锁)
    • 首先,事务 B 将在表 table 上尝试加意向排他锁(IX 锁),以表明接下来会在某些行上加排他锁。
  2. 检查意向锁的兼容性
    • 意向排他锁(IX 锁)与其他意向排他锁(IX 锁)和意向共享锁(IS 锁)都是兼容的,因此可以成功加锁。
    • 意向排他锁(IX 锁)与表级共享锁(S 锁)和表级排他锁(X 锁)不兼容,但此处没有表级锁冲突。
  3. 请求行级排他锁(X 锁)
    • 事务 B 发出对 id=5 记录加排他锁(X 锁)的请求。
    • MySQL 检查行级锁的兼容性。由于 id=5 的记录当前没有被其他事务加锁,排他锁(X 锁)可以成功加锁。(如果此时事务 B 对 id=1 添加行级锁,那么事务 B 会被阻塞,直到事务 A 释放了行级锁)
  4. 加锁成功
    • 事务 B 成功对 id=5 的记录加上排他锁(X 锁)。
锁的兼容性矩阵

为了更好地理解意向锁和行级锁的兼容性,以下是锁的兼容性矩阵:

锁类型ISIXSX
ISYesYesYesNo
IXYesYesNoNo
SYesNoYesNo
XNoNoNoNo
示例代码

以下是一个具体示例代码来说明上述流程:

  1. 事务 A

    START TRANSACTION;
    -- 对 id=1 的记录加排他锁
    SELECT * FROM table WHERE id = 1 FOR UPDATE;  -- 行级排他锁 X
    
  2. 事务 B

    START TRANSACTION;
    -- 对 id=5 的记录加排他锁
    SELECT * FROM table WHERE id = 5 FOR UPDATE;  -- 行级排他锁 X
    

在这个示例中:

  • 事务 A 对 id=1 的记录加了排他锁(X 锁)。
  • 事务 B 对 id=5 的记录加了排他锁(X 锁)。
总结
  1. 意向排他锁(IX 锁)
    • 事务 B 需要在表 table 上加意向排他锁(IX 锁)。由于 IX 锁之间是兼容的,并且没有表级别的锁冲突,IX 锁加锁成功。
  2. 行级排他锁(X 锁)
    • 事务 B 对 id=5 的记录加行级排他锁(X 锁),由于 id=5 没有被其他事务锁定,所以排他锁加锁成功。

这整个过程确保了即使在高并发环境下,事务之间能够协调操作,避免数据冲突和不一致。通过意向锁和行级锁的配合,MySQL 能够有效地管理并发事务对数据库的访问和操作。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/35087.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣算法-9.回文数

9.回文数 个人思考 首先从示例2可以看出符号也算在整数这个整体内,可以先判断整数若为负数则返回false其次很容易就会想到遍历两次,从头以及从尾,遍历得到的结果相比较,相同则为回文数 public class Alee9 {public static void …

OpenResty的安装及高级使用

OpenResty的安装及高级使用 1. OpenResty的安装1.1. 二进制版本安装1.2. 源码方式安装2. 日志打印header和body3. 替换body体字符串1. OpenResty的安装 OpenResty的中文站点:https://openresty.org/cn/    OpenResty的英文站点:https://openresty.org/en/ 1.1. 二进制版本…

【linux基础】后台执行命令,防止中断nohup

前台运行与后台运行:前台运行,就是运行过程一直在屏幕输出。 目的:1. 提交至后台 & 2.防止中断 nohup 1.终端上不要有大量的log出现,后台运行 (1) & 程序后台运行 #脚本、修改权限 vi test.sh chmod 777 test.sh#后…

ArcGIS Pro SDK (三)Addin控件 3 事件功能类

22 ArcGIS Pro 放置处理程序 目录 22 ArcGIS Pro 放置处理程序22.1 添加控件22.2 Code 23 ArcGIS Pro 构造工具23.1 添加控件23.2 Code 24 ArcGIS Pro 表构造工具24.1 添加控件24.2 Code 22.1 添加控件 22.2 Code 放置处理程序可以实现文件拖动放置、TreeVIew、ListBox等控件拖…

极速安装的艺术:使用 Mamba 革新你的 Conda 环境管理

标题:极速安装的艺术:使用 Mamba 革新你的 Conda 环境管理 引言 在数据科学和机器学习领域,Conda 是一个广受欢迎的包管理器和环境管理器。然而,随着项目规模的增长,Conda 在处理大量依赖时可能会显得缓慢。Mamba&am…

水下机器人ArduSub 固件常用参数

目前最新版的ArduSub 固件是4.1.2,本文的参数是基于这个版本的固件 SURFACE_DEPTH:水表深度读数 当水下机器人在水面时,水压传感器将读取的深度数据(以厘米为单位),这个相当于抵消零偏 单位:…

ArcGIS批量设置多图层的三调地类符号

​​ 点击下方全系列课程学习 点击学习—>ArcGIS全系列实战视频教程——9个单一课程组合系列直播回放 01需求说明 这次我们要实现的是将多个地类图层批量符号化。比如将多个三调地类图斑批量符号化。 ​ 有什么好方法呢 ? 我们可以将一个图层利用三调符号库进行…

android 从应用中打开第三方应用

打开第三方应用之前需要先判断该应用是否存在,代码如下: public boolean isAppInstalled(Context context, String packageName) {PackageManager packageManager context.getPackageManager();try {packageManager.getPackageInfo(packageName, Packa…

Stable Diffusion 3 正式开源,超强文生图模型 SD3-M 上线,赶紧来试试吧!

前言 我们都知道 Stable Diffusion 3 是一款强大的文生图模型,拥有20亿参数,因其高效的推理速度和卓越的生成效果而备受瞩目。 近日,Stability AI在推特上宣布正式开源了 Stable Diffusion 3 Medium(SD3-M) 权重&…

Dooprime外汇:如何高效规划家庭理财?从哪里开始?

摘要: 家庭理财是每个家庭都必须面对的重要课题。合理的理财规划不仅能提高家庭的生活质量,还能为未来的生活提供保障。然而,许多人在面对复杂的理财选项和信息时感到无从下手。本文将从不同角度详细分析如何进行高效的家庭理财规划&#xf…

【Playwright+Python】手把手带你写一个自动化测试脚本

如何使用代理方式打开网页 在 playwright.chromium.launch() 中传入 proxy 参数即可,示例代码如下: 1、同步写法: from playwright.sync_api import sync_playwrightproxy {server: http:/127.0.0.1:8080}def run():with sync_playwright(…

Kafka精要

Apach Kafka 是一款分布式流处理框架,用于实时构建流处理应用。它有一个核心 的功能广为人知,即 作为企业级的消息引擎被广泛使用 kafka设计 Kafka 将消息以 topic 为单位进行归纳 将向 Kafka topic 发布消息的程序成为 producers. 将预订 topics 并消…

Linux内核开发-编写一个proc文件

0.前言 上一章(点击返回上一章)完成了一个内核模块的编写,实现了在内核运行时的动态加载和卸载。 在模块的开发调测过程中或者模块运行过程中,可能需要打印内核模块的变量的值或者想要动态开关模块的运行日志打印,那么…

小盒子跑大模型!基于算能BM1684X+FPGA平台实现大模型私有化部署

当前,在人工智能领域,大模型在丰富人工智能应用场景中扮演着重要的角色,经过不断的探索,大模型进入到落地的阶段。而大模型在落地过程中面临两大关键难题:对庞大计算资源的需求和对数据隐私与安全的考量。为应对这些挑…

springcloud-gateway include-expression 配置说明

在开发过程中遇到的一些配置问题,记录下来以供参考 spring-gateway版本是2.2.9-release,使用的spring cloud dependence 是 Hoxton.SR12 在依赖eureka 服务发现并自动将发现服务器加入到router中的时候,需要指定对应的服务进行添加,根据文档…

postman国内外竞争者及使用详解分析

一、postman简介 Postman 是一款广泛使用的 API 开发和测试工具,适用于开发人员和测试人员。它提供了一个直观的界面,用于发送 HTTP 请求、查看响应、创建和管理 API 测试用例,以及自动化 API 测试工作流程。以下是 Postman 的主要功能和特点…

linux的CP指令

实现 CP 指令 src 源文件 des 目标文件 执行流程: 打开源文件( src ) open 打开目标文件( des ) open 写入目标文件 write 读取 src 文件到缓存数组 read 关闭目标文件和源文件 close ./a.out src.c de…

开源网安参与编制的《代码大模型安全风险防范能力要求及评估方法》正式发布

​代码大模型在代码生成、代码翻译、代码补全、错误定位与修复、自动化测试等方面为研发人员带来了极大便利的同时,也带来了对安全风险防范能力的挑战。基于此,中国信通院依托中国人工智能产业发展联盟(AIIA),联合开源…

chmod,chown命令

一.chmod命令 1.chmod命令的作用 我们使用chmod命令来修改文件和文件夹的权限信息(只有文件和文件夹的所属用户和root用户可以修改该文件或文件夹的权限信息) 2.chmod命令的语法 chmod [-R] 我们将要赋予用户/用户组/其他用户的权限 要修改的文件/文件…

SpringBoot实现定时任务的动态停止和更新

目录 定时任务管理器定时任务的任务接口定时任务和定时任务结果的缓存对象定时任务使用姿势 定时任务管理器 负责启动一个定时任务、停止一个定时任务、更新一个定时任务 /*** 定时任务管理器* 1、创建并启动一个定时任务* 2、停止一个定时任务* 3、更新一个定时任务*/ publi…