mysql面试题五(锁)

目录

1.mysql有哪些锁及作用

1. 行锁(Row Locks)

2. 间隙锁(Gap Locks)

3. Next-Key Locks

4. 意向锁(Intention Locks)

5. 表锁(Table Locks)

6. 元数据锁(Metadata Locks, MDL)

7. 自增锁(Auto-Increment Locks)

2.隔离级别和锁的关系

1.读未提交(Read Uncommitted)

2.读已提交(Read Committed)

3.可重复读(Repeatable Read)

4.串行化(Serializable)

3.InnoDB 中的锁算法

4.什么是快照读和当前读

快照读

当前读

5.什么是 MVCC 以及实现

1. 事务版本号(Transaction ID)

2. 数据行的隐藏列

3. undo 日志(Undo Logs)

4. 快照读与当前读

5. Read View(读视图)


1.mysql有哪些锁及作用

MySQL 中的锁机制主要用于在并发环境中管理对数据的访问,确保数据的一致性和完整性。InnoDB 存储引擎作为 MySQL 中支持事务的主流引擎,提供了丰富的锁类型来应对不同的并发场景。以下是一些主要的锁类型及其作用:

1. 行锁(Row Locks)

  • 作用:锁定单个数据行,防止其他事务同时对同一行进行写操作,支持高并发下的精细化访问控制。
  • 类型
    • 共享锁(Shared Locks / S Locks):允许事务读取一行数据,阻止其他事务对该行加排他锁(即写锁)。
    • 排他锁(Exclusive Locks / X Locks):允许事务修改一行数据,阻止其他事务对该行加任何锁(包括读锁和写锁)。

2. 间隙锁(Gap Locks)

  • 作用:锁定索引记录之间的间隙,防止其他事务在该间隙内插入新记录,主要用于防止幻读(Phantom Reads)。
  • 场景:在可重复读(Repeatable Read)隔离级别下,InnoDB 使用 Next-Key Locks,其中包含了 Gap Locks。当进行范围查询时,除了锁定查询命中的记录,还会锁定查询范围内的间隙。

3. Next-Key Locks

  • 作用:结合了行锁和间隙锁,锁定一个记录及其前一个间隙。在可重复读隔离级别下,Next-Key Locks 能有效防止幻读。
  • 场景:当查询条件涉及索引列时,InnoDB 通常会使用 Next-Key Locks。锁定范围包括索引记录本身及其左侧的间隙。

4. 意向锁(Intention Locks)

  • 作用:意向锁是一种表级别的锁,用于表示事务对表中某一行的加锁意图,分为意向共享锁(IS Locks)和意向排他锁(IX Locks)。
  • 场景:在事务申请行锁之前,先在表级别加意向锁。这样,当多个事务同时请求不同行的锁时,可以通过检查意向锁来快速判断是否存在锁冲突,避免了逐行检查的开销。

5. 表锁(Table Locks)

  • 作用:锁定整张表,阻止其他事务对表进行读写操作,适用于全表扫描、DDL 操作等场景。
  • 类型
    • 表共享锁(Table Read Locks / Shared Table Locks):允许事务读取表中的数据,阻止其他事务对该表加表写锁或进行 DDL 操作。
    • 表排他锁(Table Write Locks / Exclusive Table Locks):允许事务修改表中的数据,阻止其他事务对该表加任何锁(包括表读锁和表写锁)或进行 DDL 操作。

6. 元数据锁(Metadata Locks, MDL)

  • 作用:在访问表的元数据(如表结构)时自动加锁,确保在并发 DDL 操作时,其他会话不会对正在被修改的表进行不兼容的操作,如读取、修改或删除表结构。
  • 类型
    • MDL 读锁(Shared MDL Locks):在查询表结构时自动加锁,多个会话可以同时持有。
    • MDL 写锁(Exclusive MDL Locks):在执行 DDL 操作时加锁,阻止其他会话对表进行读取或写入操作。

7. 自增锁(Auto-Increment Locks)

  • 作用:在使用 AUTO_INCREMENT 列时,确保为新行生成的自增值是唯一的,不会被并发插入的事务重复使用。
  • 场景:当向包含 AUTO_INCREMENT 列的表中插入新行时,InnoDB 会获取自增锁,确保生成并分配唯一的自增值。

综上所述,MySQL 中的锁种类丰富,涵盖了行级、间隙级、表级以及元数据级,每种锁都有其特定的作用和适用场景,共同协作以实现对数据并发访问的有效控制,确保数据的一致性和完整性。在实际应用中,理解和合理使用这些锁类型对于优化并发性能、避免死锁和数据冲突至关重要。

2.隔离级别和锁的关系

MySQL 的事务隔离级别与锁机制密切相关,它们共同决定了在并发事务环境下数据的一致性和并发性能。隔离级别定义了事务之间数据访问的隔离程度,而锁则是实现这些隔离级别所采用的具体控制手段。以下是隔离级别与锁之间的具体关系:

1.读未提交(Read Uncommitted)

最低级别,允许事务看到其他未提交事务的修改。这种级别下,读操作通常不加锁或仅使用非常短暂的共享锁,可能导致脏读、不可重复读和幻读问题。

2.读已提交(Read Committed)

  • 在这个级别,一个事务只能看到已经提交的数据。读操作一般采用快照读(Snapshot Read)或当前读(Current Read),前者依赖于MVCC(多版本并发控制)机制,无需加锁;后者则需要加共享锁,直到当前读操作完成。
  • 写操作仍然需要加排他锁,但在事务提交后立即释放,从而减少锁的持续时间,降低锁冲突。

3.可重复读(Repeatable Read)

  • MySQL InnoDB 引擎的默认隔离级别。在此级别,一个事务在整个执行过程中看到的数据视图是不变的,即多次读取同一数据会得到相同的结果。
  • 快照读继续使用 MVCC 机制,无需加锁,保证了在事务期间的可重复读。
  • 当前读(如 SELECT ... FOR UPDATE 或 SELECT ... LOCK IN SHARE MODE,以及所有写操作)会使用行锁,并且在可重复读隔离级别下,InnoDB 还会使用间隙锁Next-Key Locks来防止其他事务插入“幻影”记录,从而避免幻读问题。

4.串行化(Serializable)

  • 最高级别,提供完全的隔离,事务按顺序依次执行,效果等同于单线程执行。
  • 实现上,通常通过更加严格的锁策略,如对查询涉及的所有数据范围加锁(不仅仅是所选行,还包括其间的间隙),或者使用Serializable Snapshot Isolation(SSI)等高级并发控制技术来模拟串行执行的效果。在这种级别下,虽然可以完全避免脏读、不可重复读和幻读,但可能导致大量的锁等待和锁冲突,显著降低系统的并发性能。

总结来说,不同的事务隔离级别对应着不同的数据一致性保证和锁使用策略:

  • 低级别(如读未提交)允许更多的并发,但可能会出现各种数据不一致现象。
  • 高级别(如可重复读、串行化)提供更强的数据一致性保证,但可能会增加锁的使用和等待,影响并发性能。

在实际应用中,选择合适的事务隔离级别需要权衡数据一致性和系统性能的需求。同时,了解不同隔离级别下锁的行为有助于诊断和优化并发事务中的性能问题,避免死锁和数据竞争。

3.InnoDB 中的锁算法

  • Record lock:单个行记录上的锁
  • Gap lock:间隙锁,锁定一个范围,不包括记录本身
  • Next-key lock:record + gap 锁定一个范围,包含记录本身

4.什么是快照读和当前读

快照读

就是读取的是快照数据,不加锁的简单 Select 都属于快照读。

SELECT * FROM player WHERE ...

当前读

就是读的是最新数据,而不是历史的数据。加锁的 SELECT,或者对数据进行增删改都会进行当前读。

SELECT * FROM player LOCK IN SHARE MODE;
SELECT FROM player FOR UPDATE;
INSERT INTO player values ...
DELETE FROM player WHERE ...
UPDATE player SET ...

5.什么是 MVCC 以及实现

MVCC(Multiversion Concurrency Control,多版本并发控制)是一种在数据库管理系统中实现并发控制的机制,尤其在支持事务的存储引擎中广泛使用,如 MySQL 的 InnoDB 存储引擎。

MVCC 的核心思想是为数据库中的每一行数据维护多个版本,使得不同的事务可以访问同一数据的不同版本,从而实现并发访问时的数据一致性与隔离性,同时避免了大量的锁操作,提高了系统的并发性能。

MVCC 的实现主要包括以下几个关键要素:

1. 事务版本号(Transaction ID)

  • 每个事务在开始时都会被分配一个全局唯一的事务ID(Transaction ID),用于标识事务的执行顺序。事务ID通常是递增的,新启动的事务ID大于已提交事务的ID。

2. 数据行的隐藏列

  • InnoDB 为每个数据行添加了两个隐藏列:trx_id 和 roll_pointer(或称为 undo_no)。
    • trx_id 存储了最后修改该行的事务ID。
    • roll_pointer 指向该行在 undo 日志(回滚日志)中的位置,用于回溯到该行的前一个版本。

3. undo 日志(Undo Logs)

  • undo 日志记录了对数据行的修改历史,包括修改前的值和修改操作类型(如 INSERT、UPDATE、DELETE)。当事务回滚时,可以通过 undo 日志恢复数据到之前的版本。
  • undo 日志按照事务ID的顺序进行组织,每个事务都有自己的 undo 日志段,用于存储该事务执行过程中产生的所有 undo 记录。

4. 快照读与当前读

  • 快照读(Snapshot Read):在可重复读(Repeatable Read)隔离级别下,事务执行普通的 SELECT 查询时,看到的是事务开始时的数据快照。InnoDB 通过比较事务ID和数据行的 trx_id,只返回事务开始前已提交的行版本。对于未提交的事务修改或事务开始后才提交的修改,快照读事务均不可见。
  • 当前读(Current Read):当使用 SELECT ... FOR UPDATESELECT ... LOCK IN SHARE MODE 或执行数据修改(INSERT、UPDATE、DELETE)操作时,会进行当前读。当前读直接查看并锁定当前最新的数据行版本,不受事务开始时快照的影响。

5. Read View(读视图)

  • 读视图是事务进行快照读时创建的一个数据视图,记录了事务开始时系统中活跃的事务ID范围。读视图用于确定事务在快照读时能看到哪些数据版本。
    • low_limit_id:小于该值的事务ID都是在当前事务开始前已经提交的。
    • up_limit_id:大于该值的事务ID都是在当前事务开始后才开启的,其修改对当前事务不可见。
    • creator_trx_id:当前事务的ID。
    • trx_ids:一个集合,存储了在当前事务开始时还未提交但之后可能提交的事务ID。

MVCC 的工作流程大致如下:

  1. 当事务开始时,InnoDB 创建一个读视图。
  2. 当事务进行快照读时,根据读视图判断数据行的可见性:
    • 如果数据行的 trx_id 小于 low_limit_id,说明该行在事务开始前已经提交,且未被其他未提交事务修改,因此对该事务可见。
    • 如果数据行的 trx_id 大于等于 creator_trx_id,说明该行是当前事务自身或在其之后开始的事务修改的,对该事务不可见。
    • 如果数据行的 trx_id 在 low_limit_id 和 creator_trx_id 之间,需要检查 trx_ids 集合。如果在集合中,说明该行被其他未提交事务修改,对该事务不可见;否则,该行可见。
  3. 若数据行不可见,InnoDB 会通过 roll_pointer 回溯到 undo 日志中找到对该事务可见的前一个版本。

通过以上机制,MVCC 实现了在不使用(或极少使用)锁的情况下,为每个事务提供一致性的数据视图,有效避免了事务间的读写阻塞,提高了并发性能。同时,MVCC 与 InnoDB 的行锁、间隙锁等其他并发控制机制相结合,确保了事务的隔离性和数据的一致性。

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

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

相关文章

蓝海彤翔作为协办单位参加2024陵水全球招商大会

4月16日,2024 陵水全球招商大会在海口第四届中国国际海南消费品博览会期间举办。蓝海彤翔作为本次大会的协办单位,将海南蓝陵数字科技有限公司与海南陵水国际数字内容产业平台落户陵水,标志着蓝海彤翔在数字内容产业领域迈出了坚实的一步&…

上位机图像处理和嵌入式模块部署(树莓派4b与视觉slam十四讲)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 实际使用中,树莓派4b是非常好的一个基础平台。本身板子价格也不是很贵,建议大家多多使用。之前关于vslam,也就是…

【黑马点评Redis——003优惠券秒杀4——消息队列Stream】

1. 目前还存在的问题 设置的阻塞队列可能会超出最大长度系统重启会导致阻塞队列中的信息消失,可能会出现问题 2. 消息队列 消息队列 (Message Queue)。 字面意思就是存放消息的队列。最简单的消息队列模型包括3个角色消息队列:存储和管理消息,也被称为…

甲醛传感器ETO-A1在建筑装修过程中甲醛监测的重要作用

随着建筑装修行业的快速发展,甲醛污染问题逐渐受到人们的关注。甲醛是一种常见的室内空气污染物,主要来源于建筑装修过程中使用的各种材料。为了保障人们的健康和安全,甲醛传感器在装修过程中的监测作用显得尤为重要。英国Alphasense公司推出…

矽塔SA6288Q栅极驱动器,可替代峰绍FD6288Q

SA6288 是一款集成了三个独立半桥栅极驱动器,特别适合于三相电机应用中高速功率MOSFET 和 IGBT 的栅极驱动。可在高达250V 电压下工作。 SA6288内置 VCC 和 VBS 欠压( UVLO )保护功能,防止功率管在过低的电压下工作,…

记一次 Java 应用内存泄漏的定位过程

问题现象 最近,笔者负责测试的某个算法模块机器出现大量报警,报警表现为机器CPU持续高占用。该算法模块是一个优化算法,本身就是CPU密集型应用,一开始怀疑可能是算法在正常运算,但很快这种猜测就被推翻:同…

springboot基于点餐码 二维码在线点餐系统vue.js+java

Maven: 项目管理和构建自动化工具,用于java项目。 java: 广泛使用的编程语言,适用于构建跨平台应用。 Springmvc:从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架。 MyBatis: java持久层框架,支持定制化SQL、存…

第68天:APP攻防-XposedFridaHook证书校验反代理代理转发

目录 思维导图 案例一:某牛防抓包-xposed&frida&r0capture 如何检测是否启动了反代理 xp框架 方案二:某社交防抓包-Proxifier&frida&r0capture 思维导图 案例一:某牛防抓包-xposed&frida&r0capture 这里某牛软…

Python | Leetcode Python题解之第46题全排列

题目: 题解: class Solution:def permute(self, nums):""":type nums: List[int]:rtype: List[List[int]]"""def backtrack(first 0):# 所有数都填完了if first n: res.append(nums[:])for i in range(first, n):# 动…

WebSocket的原理、作用、API、常见注解和生命周期的简单介绍,附带SpringBoot示例

文章目录 原理作用客户端 API服务端 API生命周期常见注解SpringBoot示例 WebSocket是一种 通信协议 ,它在 客户端和服务器之间建立了一个双向通信的网络连接 。WebSocket是一种基于TCP连接上进行 全双工通信 的 协议 。 WebSocket允许客户端和服务器在 单个TCP连接上…

基于FPGA轻松玩转AI

启动人工智能应用从来没有像现在这样容易!受益于像Xilinx Zynq UltraScale MPSoC 这样的FPGA,AI现在也可以离线使用或在边缘部署、使用.可用于开发和部署用于实时推理的机器学习应用,因此将AI集成到应用中变得轻而易举。图像检测或分类、模式…

Python写个二维码

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、进入官网下载二、下载一下三.输入代码 前言 提示:以下是本篇文章正文内容,下面案例可供参考 一、进入官网下载 官网 pip insta…

vue3推荐算法

Vue 3 推荐算法主要指的是在 Vue 3 框架中实现的或者适用于 Vue 3 的算法库或组件库。Vue 3 由于其优秀的设计和性能,被广泛应用于构建各种类型的应用程序,包括需要复杂算法支持的项目。以下是一些在 Vue 3 中可能会用到的推荐算法资源: Vue-…

田忌赛马【洛谷P1650】

P1650 田忌赛马 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include<iostream> #include <algorithm> #include<cstdio> #include <map> using namespace std; const int N1e5100; int n; map<int,int>a,b;//映射&#xff0c;速度->数量…

新网站上线需要注意什么?

质量保证&#xff1a;确保网站的所有功能和页面都经过了充分的测试&#xff0c;并且在各种不同的浏览器和设备上都能够正常运行。检查所有链接、表单和交互式元素&#xff0c;确保它们都能够按照预期工作。优化性能&#xff1a;确保网站加载速度快&#xff0c;响应迅速。优化图…

Python-VBA函数之旅-isinstance函数

目录 一、isinstance函数的常见应用场景&#xff1a; 二、isinstance函数使用注意事项&#xff1a; 三、如何用好isinstance函数&#xff1f; 1、isinstance函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff…

基于spring boot学生综合测评系统

基于spring boot学生综合测评系统设计与实现 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 服务器&#xff1a;tomcat7 数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09; 数据库工具&#xff1a;Navicat11 开发软件…

typedef 定义函数指针

typdef int(*FUNC_TYPE)(int,int) FUNC_TYPE p NULL; 定义了一个函数指针 函数指针作为函数的参数的用法demon

黄金行情下跌有投资机会吗?

尽管黄金价格的波动常常引起投资者的高度关注&#xff0c;但行情的下跌未必只是警讯&#xff0c;亦可能蕴藏着某些难得的投资机会。总之&#xff0c;答案是肯定的——在黄金行情下跌时&#xff0c;依旧有适宜的投资机会&#xff0c;只是这需要投资者具备相应的应对知识和策略。…

美森快船和以星快船有什么区别?美线海运都有哪些快船?

在繁忙的国际海运市场中&#xff0c;快船服务以其高效、快捷的特点受到广大货主的青睐。其中&#xff0c;美森快船和以星快船作为知名的海运服务提供商&#xff0c;凭借着卓越的服务品质&#xff0c;在航运界树立了良好的口碑。那么&#xff0c;美森快船和以星快船究竟有何不同…