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

MYSQL篇--锁机制高频面试题

Mysql锁机制

1对mysql的锁有了解吗?

首先我们要知道,mysql的锁 其实是为了解决在并发事务时所导致的数据不一致问题的一种处理机制,也就是说 在事务的隔离级别实现中,就需要利用锁来解决幻读问题
然后我们可以聊到锁的分类
按锁的粒度可以分为

  1. 行锁:锁某行数据,锁粒度最⼩,并发度⾼
  2. 表锁:锁整张表,锁粒度最大,并发度低
  3. 间隙锁:锁的是⼀个区间

按锁的性质可以分为

  1. 共享锁:也就是读锁,⼀个事务给某行数据加了读锁,其他事务也可以读,但是不能写
  2. 排它锁:也就是写锁,⼀个事务给某行数据加了写锁,其他事务不能读,也不能写

还可以分为

  1. 乐观锁:并不会真正的去锁某行记录,而是通过⼀个版本号来实现的
  2. 悲观锁:上面所的行锁、 表锁等都是悲观锁

2什么是死锁?怎么解决?

常规回答:死锁它其实是两个或者多个事务在同一个资源上相互占用,同时并请求锁定对方的资源,从而导致恶性循环的现象

解决办法:

  1. 程序再并发存取多个表的时候,尽量让他们以相同的顺序来访问表
  2. 在同一个事务中,尽可能做到一次锁定所需要的所有资源,来避免死锁问题
  3. 对于比较容易产生死锁的部分,可以尝试升级锁的颗粒度,比如使用表级锁,或者分布式事务锁,或者使用乐观锁

3 数据库的乐观锁和悲观锁是什么,如何实现?

首先我们要明白数据库的四大特性,ACID-其中有隔离性,也就是多个事务在并发执行时 他们内部是不能互相干扰的,而悲观锁和乐观锁正是实现隔离性的一种方式

悲观锁:简单的理解就是 它假定会发生并发冲突,在查询完数据的时候就会把事务锁起来,直到提交事务
实现方式:使用数据库中的锁机制–select * for update

乐观锁:它就是说假定不会发生并发冲突,也就是只在提交操作的时候才会检查数据的完整性,在进行修改的时候把事务锁起来
实现方式:版本号机制和cas算法

最后可以总结下:两种锁其实并没有好坏之分,但是却有分别合适的场景,对于乐观锁来说 它其实更适合读多写少的场景,也就是说冲突很少发生的场景,这样的话 就会省去锁的开销,加大系统的吞吐量,相反针对写比较多的场景,乐观锁可能会频繁的冲突,进而导致上层应用不断地retry,这样反倒降低了性能,因此悲观锁更适合写多场景

4 MySQL中InnoDB引擎的行锁是怎么实现的?

首先我们要明白行锁它其实就是记录锁,说白了也就是对表中的记录加锁,简称记录锁,但是注意记录锁-行锁它是锁住索引记录,而不是数据记录,即其实是基于索引来完成的加锁。
你比如说select * from db where a = 1 for update, 这里的for update就是根据条件来完成行锁锁定,并且这里的条件也是有索引建的列,如果a字段不是索引键 将会对整张表加锁
同时记录锁也是排它(X)锁, 所以会阻塞其他事务对其插入、更新、删除。

5 什么是间隙锁-Gap lock?

间隙锁 是 Innodb 在 RR(可重复读) 隔离级别 下为了解决 幻读问题 时引入的锁机制
而间隙锁它其实也算是行锁的一种,另外尤其注意的是间隙锁 它锁住的是一个区间,而不仅仅是这个区间中的每一条数据。
举例来说,假如student表中只有101条记录,其empid的值分别是1,2,…,100,101,

SELECT * FROM student WHERE sid > 100 FOR UPDATE

当我们用条件检索数据,并请求共享或排他锁时,InnoDB不仅会对符合条件的empid值为101的记录加
锁,也会对sid大于101(这些记录并不存在)的“间隙”加锁。
这个时候如果你插入empid等于102的数据的,如果那边事物还没有提交,那你就会处于等待状态,无法插入数据。

6 什么是临键锁(Next-Key Locks)?

Next-key锁是记录锁和间隙锁的组合,它指的是加在某条记录以及这条记录前面间隙上的锁。
也可以理解为一种特殊的间隙锁
通过临建锁可以解决 幻读 的问题。
每个数据行上的非唯一索引列上都会存在一把临键锁,当某个事务持有该数据行的临键锁时,会锁住一段左开右闭区间的数据。
注意:临键锁只与 非唯一索引列 有关,在 唯一索引列(包括主键列)上不存在临键锁。
举个例子
假设有如下表:id主键, age 普通索引
在这里插入图片描述
该表中 age 列潜在的临键锁有:
(-∞, 10],
(10, 24],
(24, 32],
(32, +∞],

在事务 A 中执行如下命令:
– 根据非唯一索引列 UPDATE 某条记录
UPDATE table SET name = Vladimir WHERE age = 24;
– 或根据非唯一索引列 锁住某条记录
SELECT * FROM table WHERE age = 24 FOR UPDATE;

不管执行了上述 SQL 中的哪一句,之后如果在事务 B 中执行以下命令,则该命令会被阻塞:
INSERT INTO table VALUES(100, 26, ‘tianqi’);
很明显,事务 A 在对 age 为 24 的列进行 UPDATE 操作的同时,也获取了 (24, 32] 这个区间内的临键锁。

这里对 记录锁、间隙锁、临键锁 做一个总结:
InnoDB 中的行锁的实现依赖于索引,一旦某个加锁操作没有使用到索引,那么该锁就会退化为表锁 。
记录锁存在于包括主键索引在内的唯一索引中,锁定单条索引记录。
间隙锁存在于非唯一索引中,锁定开区间范围内的一段间隔
临键锁存在于非唯一索引中,该类型的每条记录的索引上都存在这种锁,它是一种特殊的间隙锁,锁定一段左开右闭的索引区间

7 什么是意向锁?

意向锁又分为 意向共享锁(IS) 和 意向排他锁(IX)

意向共享(IS)锁:简单理解就是事务有意向对表中的某些行加共享锁(S锁)
即-- 事务要获取某些行的 S 锁,必须先获得表的 IS 锁。
SELECT column FROM table … LOCK IN SHARE MODE;

意向排他(IX)锁:即事务有意向对表中的某些行加排他锁(X锁)
– 事务要获取某些行的 X 锁,必须先获得表的 IX 锁。
SELECT column FROM table … FOR UPDATE;

首先我们要明白四点
意向共享锁(IS)和 意向排他锁(IX)都是表锁。
意向锁是一种 不与行级锁冲突的表级锁,这一点非常重要。
意向锁是 InnoDB 自动加的, 不需用户干预
意向锁是在 InnoDB 下存在的内部锁,对于MyISAM 而言 没有意向锁之说。(即只针对InnoDB

那么问题来了,既然前面已经有了共享锁(S锁)、排它锁(X锁)。
又为什么需要引入意向锁呢?它能解决什么问题呢?
我们可以理解 意向锁 存在的目的就是 为了让 InnoDB 中的行锁和表锁更高效的共存 。
也就是说 如果某个事物要加表锁,如果没有意向锁 那么它就需要去检测表中的每一行是否存在排他锁。很明显这是一个效率很差的做法,
但是有了意向锁之后,情况就不一样了:这个事务只要看表上有没有
意向共享锁,有则说明表中有些行被共享行锁锁住了,因此,事务B申请表的写锁会被阻塞。这样就高效多了

这里我们再来看下 共享(S)锁、排他(X)锁、意向共享锁(IS)、意向排他锁(IX)的兼容性
在这里插入图片描述
可以看出 意向锁之间是互相兼容的.那你存在的意义是啥?
意向锁不会为难意向锁。也不会为难行级排他(X)/共享(X)锁,它的存在是为难 表级 排他(X)/共享(X)锁。
在这里插入图片描述
注意 这里的排他(X)/共享(S)锁指的都是表锁!意向锁不会与行级的共享/排他锁互斥! 行级别的X和S按照上面的兼容性规则即可。
意向锁与意向锁之间永远是兼容的,因为当你不论加行级的X锁或S锁,都会自动获取表级的IX锁或者IS锁。
也就是你有10个事务,对不同的10行加了行级X锁,那么这个时候就存在10个IX锁。
这10IX存在的目的是啥呢,就是假如这个时候有个事务,想对整个表加排它X锁,那它不需要遍历每一行是否存在S或X锁,而是看有没有存在意向锁,只要存在一个意向锁,那这个事务就加不了表级排它X
锁,要等上面10个IX全部释放才行。

8 什么是插入意向锁?

插入意向锁 的特性可以分成两部分:
插入意向锁是一种特殊的间隙锁 —— 间隙锁可以锁定开区间内的部分记录。
插入意向锁之间互不排斥,所以即使多个事务在同一区间插入多条记录,只要记录本身(主键、唯一索引)不冲突,那么事务之间就不会出现冲突等待。
需要强调的是,虽然插入意向锁中含有意向锁三个字,但是它并不属于意向锁而属于间隙锁,因为意向锁 是表锁而 插入意向锁是行锁
总结下:

  1. InnoDB在RR的事务隔离级别下,使用插入意向锁来控制和解决并发插入。
  2. 插入意向锁是一种特殊的间隙锁。
  3. 插入意向锁在锁定区间相同但记录行本身不冲突的情况下互不排斥。

9 MySQL间隙锁,如何解决幻读?

首先我们要知道
在RR的隔离级别下,Innodb使用MVCC和 next-key locks(行锁和间隙锁的组合)解决幻读,
MVCC解决的是普通读(快照读)的幻读
next-key locks解决的是当前读情况下的幻读。
MySQL间隙锁 + 记录锁 ,组合起来,解决的是当前读情况下的幻读

至于MVCC如何解决幻读的 请看 我之前的事务篇
而在这里 我们简单说下什么是当前读和快照读

快照读(历史数据)-mvcc
快照读对应的sql 语法:简单的select操作(不包括 select … lock in share mode, select … for update)

当前读(最新数据)对应的sql 语法:
select * from table where ? lock in share mode;
select * from table where ? for update;
insert into table values (…);
update table set ? where ?;
delete from table where ?;
特殊的读操作,插入/更新/删除操作,属于当前读,需要加锁。
那么解决原理其实就是 保证数据是一致的(也就是一个事务,其内部读取对应某一个数据的时候,数据都是一样的),同时读取的数据是最新的数据。
innodb提供了next-key lock,也就是结合gap锁与行锁,达到最终目的

相关文章:

MYSQL篇--锁机制高频面试题

Mysql锁机制 1对mysql的锁有了解吗? 首先我们要知道,mysql的锁 其实是为了解决在并发事务时所导致的数据不一致问题的一种处理机制,也就是说 在事务的隔离级别实现中,就需要利用锁来解决幻读问题 然后我们可以聊到锁的分类 按锁…...

创建一个郭德纲相声GPTs

前言 在这篇文章中,我将分享如何利用ChatGPT 4.0辅助论文写作的技巧,并根据网上的资料和最新的研究补充更多好用的咒语技巧。 GPT4的官方售价是每月20美元,很多人并不是天天用GPT,只是偶尔用一下。 如果调用官方的GPT4接口&…...

靶机实战(10):OSCP备考之VulnHub Tre 1

靶机官网:Tre: 1[1] 实战思路: 一、主机发现二、端口发现(服务、组件、版本)三、漏洞发现(获取权限) 8082端口/HTTP服务 组件漏洞URL漏洞(目录、文件)80端口/HTTP服务 组件漏洞URL漏…...

在windows11系统上利用docker搭建linux记录

我的windows11系统上,之前已经安装好了window版本的docker,没有安装的小伙伴需要去安装一下。 下面直接记录安装linux的步骤: 一、创建linux容器 1、拉取镜像 docker pull ubuntu 2、查看镜像 docker images 3、创建容器 docker run --…...

swift对接环信sdk

准备 熟练objective-c语言 有一台mac电脑,并安装了xcode 和 cocoapods 内容篇幅较长,需要内心平和耐心看下去,务必戒躁. 学习目的 手把手教大家如何在iOS应用中集成环信IM 明确表示,内容一定全面,没有任何丢失,只要沉得住气,耐得下心,3小时即可搞定. 若经常阅读文档以及语…...

单片机中的PWM(脉宽调制)的工作原理以及它在电机控制中的应用。

目录 工作原理 在电机控制中的应用 脉宽调制(PWM)是一种在单片机中常用的控制技术,它通过调整信号的脉冲宽度来控制输出信号的平均电平。PWM常用于模拟输出一个可调电平的数字信号,用于控制电机速度、亮度、电压等。 工作原理 …...

css 怎么绘制一个带圆角的渐变色的边框

1&#xff0c;可以写两个样式最外面的div设置一个渐变的背景色。里面的元素使用纯色。但是宽高要比外面元素的小。可以利用里面的元素设置padding这样挡住部分渐变色。漏出来的渐变色就像边框一样。 <div class"cover-wrapper"> <div class"item-cover…...

Kotlin DSL C++项目引入OpenCV异常处理

现象 kotlin DSL(build.rgadle.kts)项目引入openCV sdk 编译提示Plugin [id: com.android.application, version: 8.2.1...错误 Plugin [id: com.android.application, version: 8.2.1, apply: false] was not found in any of the following sources:* Try: > Run with -…...

【微服务】 Spring cold、Kubernetes、Service mesh

目录 Spring Cloud # 什么是微服务&#xff1f;谈谈你对微服务的理解&#xff1f; # 什么是Spring Cloud&#xff1f; # springcloud中的组件有那些&#xff1f; # 具体说说SpringCloud主要项目? # Spring Cloud 和dubbo区别? # 服务注册和发现是什么意思&#xff1f;S…...

【scala】编译build报错 “xxx is not an enclosing class“

private[sources] val creationTimeMs: Long {val session SparkSession.getActiveSession.orElse(SparkSession.getDefaultSession)require(session.isDefined)private[xxx]是访问权限控制在xxxx包的意思。 解决办法&#xff1a; 把[sources]删掉&#xff0c;或者改成和包名…...

vue3+ts+vite项目从0 搭建,配置安装router/pinia/element-plus/scss等

一、安装vite环境 官网&#xff1a;https://cn.vitejs.dev/guide/why.html npm init vite1.选择vue 2.选择typescipt 3.创建成功 默认项目结构如下 4.安装项目依赖 npm install 5.启动项目 npm run dev二。安装配置scss 1.运行安装scss npm install -D sass sass-loa…...

华为OD机试 - 矩阵匹配(Java JS Python C)

题目描述 从一个 N * M(N ≤ M)的矩阵中选出 N 个数,任意两个数字不能在同一行或同一列,求选出来的 N 个数中第 K 大的数字的最小值是多少。 输入描述 输入矩阵要求:1 ≤ K ≤ N ≤ M ≤ 150 输入格式: N M K N*M矩阵 输出描述 N*M 的矩阵中可以选出 M! / N! 种组合数…...

使用ffmpeg实现音频静音修剪

1 silenceremove介绍 本文主要介绍在 FFmpeg 命令中使用 silenceremove filter 进行音频静音的修剪。 1.1 start_x参数 参数名说明取值范围默认值start_periods设置是否应在音频开头修剪音频。0 表示不应从一开始就修剪静音。当指定一个非 0 值时&#xff0c;它会修剪音频直…...

Java项目调试实战:如何高效调试Spring Boot项目中的GET请求,并通过equalsIgnoreCase()解决大小写不一致问题

Java项目调试实战&#xff1a;如何高效调试Spring Boot项目中的GET请求&#xff0c;并通过equalsIgnoreCase解决大小写不一致问题 写在最前面全部过程Java equalsIgnoreCase() 方法idea中如何调试SpringBoot项目在IntelliJ IDEA中使用内置HTTP客户端设置断点和调试 补充&#x…...

Google Pixel 与 iPhone手机:哪个更好?

iPhone稳定可靠&#xff0c;Pixel性价比高且创新。两者各有千秋&#xff0c;满足不同需求 谷歌的 Pixel 手机是 Android 最接近 iPhone 的手机&#xff0c;也是真正原生的Android手机。在iPhone 15 Pro Max 与华为 Mate 60 Pro的比较中不难看出&#xff0c;iPhone依然有着极强…...

ddos攻击会让服务器受到什么影响?-速盾网络(sudun)

DDoS攻击是一种网络攻击手段&#xff0c;它通过利用大量的请求或恶意流量超过服务器的处理能力&#xff0c;从而导致服务器无法正常工作或服务质量显著下降。 首先&#xff0c;DDoS攻击会对服务器的带宽造成极大的压力。攻击者会利用大量的机器或网络资源发起攻击&#xff0c;…...

NSSCTF Interesting_include

开启环境: 通过审计,我们可知: flag在flag.php中,可以利用php中伪协议 payload:?filterphp://filter/readconvert.base64-encode/resourceflag.php 将其base64解码就是flag. NSSCTF{3dc54721-be9e-444c-8228-7133fba76ad4}...

IPv6路由协议---IPv6动态路由(OSPFv3-5)

OSPFv3各链路状态通告类型 4.Inter-Area-Router-LSA区域间路由器(4类LSA) 边界路由器(ABR)产生的第4类LSA,在Area 范围内泛洪,描述了到本AS内其他区域的ASBR路由器信息; 每各Inter-Area-Router-LSA包含一个ASBR路由器信息,LSA中的能力选项(Options)与所描述的ASBR …...

GPT Store开业大吉:一场AI技术与创新的盛宴

就在1.11 日&#xff0c;ChatGPT 正式上线 GPT Store &#xff01; OpenAI CEO 山姆奥特曼第一时间确认了这个消息&#xff1a; 自从GPTs的概念提出以来&#xff0c;短短两个月内&#xff0c;全球用户已经创造了超过300万个GPTs。 点击 GPT Store 或者进入ChatGpt页面&am…...

Linux---gcc编译

目录 前言 一、gcc编译 二、程序的编译过程 三、gcc查看编译过程 1.预处理阶段 2.编译 3.汇编 4.链接 动静态库链接的内容 动静态库链接的优缺点 5.总结记忆 前言 在前面我们学会使用vim对文件进行编辑&#xff0c;如果是C或者C程序&#xff0c;我们编辑好了内容…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

免费数学几何作图web平台

光锐软件免费数学工具&#xff0c;maths,数学制图&#xff0c;数学作图&#xff0c;几何作图&#xff0c;几何&#xff0c;AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...