【经典面试题】行锁?表锁?间隙锁?意向锁?排他锁?MySQL的锁机制

目录

    • 前言
    • 一、锁的分类
    • 二、使用场景
      • 全局锁
      • 表级锁
      • 行级锁
      • 间隙锁与临键锁
    • 三、锁与事物的隔离级别
      • 1. 读未提交(Read Uncommitted)
      • 2. 读已提交(Read Committed)
      • 3. 可重复读(Repeatable Read)
      • 4. 串行化(Serializable)
      • 注意事项

前言

MySQL中的锁机制是在多线程或并发场景下的一种资源调度策略,旨在维护数据的完整性和一致性。

一、锁的分类

  1. 按锁的粒度划分

    • 全局锁:影响整个数据库实例,非常少见,通常用于备份等场景。
    • 表级锁:锁定整个表,开销较小,但并发性低,MyISAM和MEMORY存储引擎支持。
    • 行级锁:粒度最细,只锁定需要的行,开销较大,但并发性能好,InnoDB存储引擎支持。
    • 页级锁:介于表锁和行锁之间,锁定数据页,BDB存储引擎支持。
  2. 按锁的类型划分

    • 共享锁(S锁,Read Lock):允许事务读取一行数据,但不允许其他事务修改。
    • 排他锁(X锁,Write Lock):允许事务修改一行数据,阻止其他事务读取或修改。
  3. 特殊类型的锁

    • 间隙锁(Gap Lock):仅在可重复读(Repeatable Read)隔离级别下,锁定两个记录之间的范围,防止插入新的记录到这个范围内,从而避免幻读。
    • 临键锁(Next-Key Lock):是Gap Lock加上Record Lock的组合,锁定一个范围并包括记录本身,同样用于解决幻读问题。
    • 意向锁(Intent Lock):表级别的锁,用来表示事务有意向在表中的某几行上加行级锁,分为意向共享锁(IS)和意向排他锁(IX)。

二、使用场景

全局锁

  • 场景:主要用于数据库的备份操作,如使用FLUSH TABLES WITH READ LOCK命令全局锁定数据库,确保备份期间数据的一致性。
  • 注意事项:使用全局锁会导致整个数据库无法进行写操作,应尽量减少其使用时间,或在低峰时段执行。

表级锁

  • 场景
    • MyISAM引擎:常用于读多写少的场景,如统计分析、报表生成等。
    • 备份操作:当备份工具不支持InnoDB在线热备份时,可锁定表进行备份。
  • 注意事项
    • 写锁会阻塞所有其他读写操作,导致并发性能低下。
    • 应谨慎使用,尤其是在高并发环境下,考虑使用行级锁的存储引擎。

行级锁

  • 场景
    • InnoDB引擎:适用于高并发写操作的场景,如在线事务处理系统。
    • 更新或查询单行或少量行数据时,以减少锁冲突,提高并发处理能力。
  • 注意事项
    • 索引优化至关重要,InnoDB行锁基于索引来实现,无索引的查询会升级为表锁。
    • 避免长事务,长时间持有行锁会影响其他事务的执行。

间隙锁与临键锁

  • 场景:在可重复读(Repeatable Read)隔离级别下,用于防止幻读。
  • 注意事项
    • 可能导致不必要的锁竞争,尤其是在大量范围查询或插入操作时。
    • 了解并监控锁争用情况,必要时调整查询或事务逻辑。

三、锁与事物的隔离级别

在MySQL中,特别是针对InnoDB存储引擎,不同的事务隔离级别会采用不同的锁策略来保证事务的隔离性。

1. 读未提交(Read Uncommitted)

  • 锁使用:在Read Uncommitted隔离级别下,事务在读取数据时通常不加锁或仅使用短暂的共享锁(S锁),这取决于存储引擎的具体实现。这意味着事务可以看到其他事务未提交的数据变更。
  • PS:由于几乎不使用锁来保护读取操作,此隔离级别下容易发生“脏读”(Dirty Read),即事务可能读取到其他事务尚未提交的数据,如果这些数据随后被回滚,则读取到的信息就是无效的。

2. 读已提交(Read Committed)

  • 锁使用:在读取数据时,事务会对读取的行加共享锁(S锁),但在读取完成后立即释放锁。在修改数据时,事务会获取排他锁(X锁),直到事务结束才释放。
  • PS:这种模式下,事务读取的总是已经提交的数据,避免了脏读,但可能会出现“不可重复读”(Non-Repeatable Read)的问题,即在同一个事务内多次读取同一行数据,可能得到不同的结果,因为其他事务已经提交了对该行的修改。

3. 可重复读(Repeatable Read)

  • 锁使用:InnoDB默认的隔离级别。在事务开始时,对于读取的每一行数据都会加共享锁,直到事务结束才释放。在修改数据时,同样使用排他锁。此外,InnoDB还使用了Next-Key Locks(包含行锁和间隙锁)来防止幻读。
  • PS:通过在整个事务生命周期内保持读取锁,确保同一事务内多次读取同一数据的结果是一致的,即解决了不可重复读问题。间隙锁的引入是为了防止插入新的记录(幻读),但这在某些情况下仍可能无法完全避免幻读,除非配合MVCC(多版本并发控制)机制。

4. 串行化(Serializable)

  • 锁使用:这是最严格的隔离级别。在事务开始时,对涉及的所有读取操作都加共享锁,并且对于写操作则加排他锁,相当于在整个事务处理过程中对涉及的表或行都加了锁。
  • PS:通过在整个事务执行期间锁定相关资源,串行化可以彻底避免脏读、不可重复读和幻读问题,但代价是牺牲了并发性能,因为事务之间变得完全串行化,不能并发执行。

注意事项

  • MVCC(多版本并发控制):在Read CommittedRepeatable Read隔离级别下,InnoDB使用MVCC来提供一定程度的并发控制,减少锁的依赖,通过维护数据的多个版本来实现事务的隔离性,但具体实现细节和锁的结合在不同隔离级别有所不同。
  • 锁的粒度:随着隔离级别的提高,锁的粒度一般会变得更细,从不加锁或表锁逐步过渡到行锁和间隙锁,以更精确地控制并发访问,但这也意味着更高的管理开销和潜在的锁竞争问题。
  • 性能与并发:选择适当的隔离级别需要在数据一致性与系统并发性能之间做出权衡。较高的隔离级别虽然提供了更强的数据一致性保证,但可能会影响并发处理能力。

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

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

相关文章

设计合适的存储系统:原则与实践

在现代信息技术领域,存储系统的设计对系统性能、可扩展性和数据管理至关重要。无论是处理大规模数据的企业,还是需要高效数据访问的小型应用,设计一个合适的存储系统都需要综合考虑多种因素。本文将探讨设计存储系统的关键原则和实践&#xf…

# linux 系统 没有 ifconfig 命令,提示: ifconfig: command not found

sudo ip route add default via 192.168.1.1 dev eth0# linux 系统 没有 ifconfig 命令,提示: ifconfig: command not found 一、问题描述: 有些伙伴在学习 linux 系统时,在 使用 ifconfig 命令 查询 系统 IP 出现 ifconfig: co…

06中间件RTOS/CP

Autosar CP 操作系统详解-CSDN博客 1. 什么是RTOS ? RTOS,英文全称是 Real-time Operation System,中文就是 实时操作系统,又称及时操作系统。 实时操作系统,是指当外界事件或数据产生时,能够接受并以足…

中国人工智能大模型价格战

近年来,人工智能技术迅猛发展,尤其是大模型领域的突破让人们看到了更多的可能性。然而,在这一高科技领域,中美两国的竞争日趋激烈。近日,中国互联网巨头们纷纷启动大模型价格战,引发了广泛关注。这场价格战…

express处理get请求和post请求

一、处理get请求 (1)req.query 1》定义: 此属性是一个对象,包含路由中每个查询字符串参数的属性。此对象默认为 {} 2》代码示例: 例如:获取http://127.0.0.1:8000/?namejane 的name的值 …

怎么在Qt Designer设计的界面上显示Matplotlib的绘图?

首先,利用Qt Designer设计界面。 设计好后保存为ui文件。 接着,将ui文件转为py文件。 我喜欢在python中进行转换,因此把转换命令封装为函数,运行一下即可。 import os # pyuic5 -o output_file.py input_file.ui #通过命令把.ui…

【云原生】Kubernetes-----POD资源限制与探针机制

目录 引言 一、资源限制 (一)基本定义 (二)资源单位 1.CPU资源 2.内存资源 (三)请求与限制 (四)定义方式 1.编写yaml文件 2.查看资源情况 二、Pod探针机制 (…

动态规划之背包问题中如何确定遍历顺序的问题-组合or排列?

关于如何确定遍历顺序 322. 零钱兑换中,本题求钱币最小个数,那么钱币有顺序和没有顺序都可以,都不影响钱币的最小个数。 所以本题并不强调集合是组合还是排列。 如果求组合数就是外层for循环遍历物品,内层for遍历背包。 如果求…

UML建模

一、概述 二、类图 三、用例图 四、顺序图 五、活动图 六、状态图 七、通信图 八、构件图

学 C/C++ 具体能干什么?

学习 C 和 C 后,你可以从事许多不同的工作和项目,这两种语言以其高性能和低级控制而闻名,特别适合以下几个领域: 1. 系统编程 C 和 C 是系统编程的首选语言,适用于操作系统、驱动程序和嵌入式系统开发。 操作系统开发…

MySQL--InnoDB体系结构

目录 一、物理存储结构 二、表空间 1.数据表空间介绍 2.数据表空间迁移 3.共享表空间 4.临时表空间 5.undo表空间 三、InnoDB内存结构 1.innodb_buffer_pool 2.innodb_log_buffer 四、InnoDB 8.0结构图例 五、InnoDB重要参数 1.redo log刷新磁盘策略 2.刷盘方式&…

常量知识点

常量的声明 关键字:const 固定写法: const 变量类型 变量名 初始值; 附上代码: //变量的声明 int i 10; //常量的声明 const int j 11;常量的特点 必须初始化不能被修改 作用:声明一些常用不变的变量,如PI等 附…

代码随想录算法训练营第50天|● 309.最佳买卖股票时机含冷冻期 ● 714.买卖股票的最佳时机含手续费 ●总结

309. 买卖股票的最佳时机含冷冻期llllll 冷冻期算单独一种情况:1.今天持有(已有or今天买)2.已经卖出3.今天卖出4.冷冻期 在最后一天的所有卖出状态中找最大值,包括冷冻期 class Solution:def maxProfit(self, prices: List[int]…

明星IP切片带货爆单营,0基础搞定IP切片带货短视频(69节课)

把握带货趋势,了解切片流程,剪辑带货创收营 课程目录: 01第一章实操链路-第一节IP选择.mp4 02第一章实操链路-第二节账号准备.mp4 03第一章实操链路-第四节开通权限.mp4 04第一章实操链路-第五节货品准备.mp4 05第一章实操链路-第六节素…

一、Servlet和JSP技术概述

注:该系列笔记是用于我在 《Servlet 与 JSP 核心编程》这本书中的学习笔记,无其他意思,侵权请联系2082045221qq.com删除。 ​ 第一章内容较少,所以暂时有用的笔记也不多。 1.1、Servlet 的功用: ​ Servlet 是运行在…

Go语言之GORM框架(二) ——GORM的单表操作

前言 在上一篇文章中,我们对Gorm进行了介绍,而在这一篇文章中我们主要介绍GORM的单表查询与Hook函数,在进行今天的内容之前我们先事先说明一下,下面我们对单表进行操作的表结构如下: type Student struct {ID uint gorm:&qu…

自学动态规划——目标和

目标和 494. 目标和 - 力扣(LeetCode) 这次做的时候递推公式搞错了捏。 经过一些列骚操作(详情见代码首部注释),我们成功将目的转化为:给i个物品,重量和价值一致,最大容量s1&…

GNU/Linux - 时区设置

CST China Standard Time 北京时间/中国标准时间 在时区划分上,属东八区,比协调世界时早 8 小时,记为 UTC8 GMT Greenwich Mean Time 格林威治标准时间 是指位于英国伦敦郊区的格林尼治天文台的标准时间,因为本初子午线被定…

推荐系统学习笔记(四)--基于向量的召回

离散特征处理 离散特征:性别,国籍,英文单词,物品id,用户id 处理: 建立字典:eg:china 1 向量化:eg:one-hot /embedding(低维稠密向量&#xf…

C语言----判断n是否是2的次方数,利用到按位与,算法n(n-1)

//写一个代码,判断n是否是2的次方数 //if(n&(n-1))0 /* 2的0次方是1---二进制1 2的1次方是2---二进制10 2的2次方是4---二进制1002的一次方-1是1---二进制是1 2的二次方-1是3---二进制是11 2的三次方-1是7---二进制是111 n与n-1 按位与后&是0就是0&#xf…