mysql面试(七)

news2024/11/13 7:57:18

前言

本章节列出了mysql在增删改查的时候,分别会涉及到哪些锁类型,又是如何交互的。
这个章节也是mysql面试基础系列的最后一章,后面准备更新redis数据类型和分布式锁相关问题。如果各位看官有什么问题的话,可以留言。

之前我们也有说关于多事务并发,会出现三种情况:脏读、不可重复读、幻读
对应的解决手段呢,分四个隔离级别:

  • 在Read uncommitted 读未提交隔离级别下, 脏读 、 不可重复读 、 幻读 都可能发生。
  • 在 Read committed 读已提交隔离级别下, 不可重复读 、 幻读 可能发生, 脏读 不可以发生。
  • 在 Repeatable Read 可重复读隔离级别下, 幻读 可能发生, 脏读 和 不可重复读 不可以发生。
  • 在 Serialiazble 串行化隔离级别下,上述问题都不可以发生。

那么实现这些隔离级别的手段是不太一样的。

读已提交很简单,事务提交之后才可以读取。

实现可重复读主要手段是MVCC机制,这个在之前我们也详细讲过具体的实现逻辑了

串行化这种最严谨的隔离级别,简单理解的话就是如果多个事务操作同一条数据,无论是读、写,都要一个个排队来执行,那如何实现这个排队执行呢,就要引入这个锁的概念了。

每当一个事务想要来操作这个数据的时候,就会生成一把锁

总的来说,锁这个概念就是用于公共资源的并发控制

分类

  • 共享锁:share lock 一般称为S锁,或者称为读锁,给一条数据加了这个锁之后,其他事务也可以来加这个S锁来读,但是不能写。
  • 独占锁:exclusive 一般称为X锁,或者称为写锁,当数据被加了这个锁之后,其他事务不可以写也不可读。
  • 意向锁:IS或者IX,当事务给记录加了行锁之后,会在表级别加上对应的意向锁,告知其他事务。还有一种是行级别的意向锁。后面细说

PS:只有S锁和S锁可以相互兼容,S锁与X锁,还有X锁与X锁之间都是互斥的。

一致性读取

这种读取方式也称为快照读,是一种无锁的读取方式,主要就是在MVCC机制中运用的。不会给任何记录加锁,是通过版本来控制同一个事务中多次读取的数据保持一致。详细可以回到上面看看。

锁定读

又叫做当前读,实现方式主要是为相关的记录加上对应的锁,防止其他事务的影响。 而加的锁又有两种类型,一种可以加S锁,lock in share mode,这时候其他事务也可以来读,但是不能写。
另一种是for update,加的是X锁,这时候其他事务不能写,也不能读。如下:

select * from user where id = 1 for update; 读写锁,排他锁
select * from user where id = 1 lock in share mode; 读锁,共享

写操作

写操作的时候,又分为删除,修改,添加三种方式。

  • delete删除的时候,在数据库中底层的逻辑其实是将这个数据给隐式删除,只要当前查询不出来就可以了。所以这时候加的就是一个X锁。
  • update修改的时候,又分为两种情况,一种是修改原数据记录,这时候加上一个X锁就行了。另一种是可能把这个原数据id之类的涉及到存储位置变动的操作,那先定位到数据加上X锁,然后将数据和锁都删除。再插入条新数据就可以了
  • insert插入操作的时候,并不会显式的加锁,会有一种叫做隐式锁的机制来处理,我们后面细说。

表锁

上面我们说的这些锁操作,默认都是加在记录上的。其实我们也可以直接给表加上S锁或者X锁。

这时候问题就来了,这里的S锁和X锁的兼容性是没变的,依旧是 只有S锁和S锁可以相互兼容,S锁与X锁,还有X锁与X锁之间都是互斥的。

  • 当表中某些数据存在S锁的时候,是不能加X锁的。
  • 表中某些数据存在X锁,也是不能加S锁和X锁的。

但是,加表锁的时候,难道要扒拉一遍表中所有数据,看看都有没有加锁吗? 不可能的,这辈子都不可能的。

所以这里还有一个表级意向锁的概念,每当有事务给某个记录加了锁,就要在表上加上一个意向锁。如果表记录中有S锁,那么表上肯定就有IS表级意向锁;如果表记录中有X锁,那么表上肯定就有IX表级意向锁。

所以当我们想要再表上加锁的时候,要看我们加的锁是不是和记录中的锁互斥,互斥的话就是不能加的。
在这里插入图片描述
其实表的锁有些鸡肋,一般情况下是用不到的。真想使用的时候可以通过这个语句手动添加:
LOCK TABLES t READ : InnoDB 存储引擎会对表 t 加表级别的 S锁 。
LOCK TABLES t WRITE : InnoDB 存储引擎会对表 t 加表级别的 X锁 。

行锁

上面我们已经了解了锁的大部分概念,但是在真正的记录锁/行锁使用中,还是有其他问题要解决的。

在这里插入图片描述
比如现在有这样一批数据,如上图。

想要在8这条记录加上一个锁,无论是加X锁或者S锁都是可以的。加上之后防止其他事务来修改数据。

但是我们已经知道隔离级别有个幻读的问题,为了解决这个问题,mysql还有一个间隙锁的概念。就是在记录与记录之间加一个间隙锁。防止当前事务处理期间,在这些数据中插入新的记录。注意,间隙锁只会加在记录的前面。 也就是说,想要给8这个数据加间隙锁的时候,默认是加在记录3和记录8之间。这时候就有个问题了,第一条还可以,那最后一条怎么加间隙锁? 也是有办法的。

还记得之前讲页面数据结构的时候,记录是一个链表,链表的尾部会固定的指向数据页固定的一个最大记录,这个最大记录是假的。数据页出现的时候就存在,就是用来定位记录链表的最后一条数据。那么往最后一条记录加间隙锁的时候,就可以在那条(伪)最大记录上加就可以了。

如果锁住某条记录,并且顺便把间隙锁加上的这种操作,官方称为next-key锁

当其他事务想要在这些记录中间插入数据的时候,会先判断该位置是否有间隙锁。如果存在间隙锁的话,就获取锁失败,陷入等待状态。一直等到前面的事务释放了这个锁,会唤醒等待的事务线程来竞争锁。
在这里插入图片描述
action:这里的锁是如何竞争,前一个事务如何唤醒后面的事务,没有找到这方面相关资料。

隐式锁

上面提过这个概念,就是在新插入一条记录的时候,并不会主动加上锁。还记得我们在MVCC机制中介绍的时候,每条记录都有一个最后修改事务id的隐藏列吗?

如果后来的事务想要给这条新记录加锁的时候,会先查看一下这个记录的最后修改id是否还在活跃中。如果还在活跃,证明当前还未提交。就主动给当前活跃的这个事务加锁,再给自己加一个等待锁。这就是一种隐式锁的概念。

死锁

如果有这样两个事务A、B,他们分别都要执行不相关的两批数据,1、2和a。但是执行执行顺序不同。A先在1、2两条记录加了锁,B先在a记录加了锁。等双方想去获取剩余记录锁的时候,发现已经被占用了,于是都在等待对方释放锁。这就造成了死锁的问题。

InnoDB会检测这种循环等待释放的死锁问题,如果检测到两个事务因为这种问题陷入了死锁,超过一定时间,InnoDB引擎会把修改记录比较少的那个事务先给回滚了,避免一直死锁。这是一种相对来说比较优的解决方式。

这说的是引擎查询导致的死锁问题,还有一种是我们分布式数据加悲观锁处理导致的死锁问题,可以改为乐观锁+版本号的操作,这里就先不展开讲了。

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

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

相关文章

【动态规划】不同路径

不同路径&#xff08;难度&#xff1a;中等&#xff09; AC代码 有点水 class Solution { public:int uniquePaths(int m, int n) {//以m为行&#xff0c;n为列&#xff0c;创建二维数组vector <vector<int>> dp(m1,vector<int>(n1));dp[0][1]1;dp[1][0]1;…

Python 教程(三):字符串特性大全

目录 专栏列表前言1. 字符串基础2. 字符串方法字符串查询字符串修改字符串切片 3. 字符串格式化旧式格式化&#xff08;% 操作符&#xff09;str.format() 方法f-string&#xff08;Python 3.6&#xff09; 4. 字符串编码5. Unicode 和 ASCII6. 正则表达式7. 字符串比较8. 字符…

LongAlign:大模型长文本处理能力提升之道

人工智能咨询培训老师叶梓 转载标明出处 大模型&#xff08;LLMs&#xff09;在处理长文本时&#xff0c;需要在输入序列上进行指令微调&#xff08;instruction finetuning&#xff09;&#xff0c;以确保它们能够有效地处理长文本。现有的方法主要集中在上下文扩展&#xff0…

ACC2.【C语言】经验积累 栈区简单剖析

int main() {int i0;int arr[10]{1,2,3,4,5,6,7,8,9,10};for (i0;i<12;i){arr[i]0;printf("A");}return 0; } 执行后无限打印A 在VS2022&#xff0c;X86,Debug环境下&#xff0c;用监视后&#xff0c;原因是arr[12]的地址与i的地址重合&#xff08;数组越界&…

c++语言学习注意事项

当学习C语言时&#xff0c;有几个重要的注意事项可以帮助初学者更有效地掌握这门强大的编程语言&#xff1a; 1. 理解基本概念和语法 C 是一门复杂且功能强大的编程语言&#xff0c;因此理解其基本概念和语法至关重要。初学者应该重点掌握以下几个方面&#xff1a; 基本语法和…

BIO示例代码

一个请求开一个线程 package org.example.demo;import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;/*** author hrui* …

2024年第四届网络通信与信息安全国际学术会议(ICNCIS 2024,8月23-25)

2024年第四届网络通信与信息安全国际学术会议&#xff08;ICNCIS2024&#xff09;将于2024年8月23-25日于杭州召开。 会议围绕网络通信在信息安全领域中的最新研究成果&#xff0c;为来自国内外高等院校、科学研究所、企事业单位的专家、教授、学者、工程师等提供一个分享专业经…

智能化车载视频监控技术的崭新发展与应用

随着国内4G网络的快速建设和发展&#xff0c;智能车载终端监控领域的高清化进程也日益加快。尽管传统的车载终端监控已经在视频录像、GPS定位等基本应用方面取得了一定的成果&#xff0c;但随着视频分析技术的不断进步&#xff0c;普通视频监控已经无法满足日益增长的车载监控新…

基于DMASM镜像的DMDSC共享存储集群部署

DMv8镜像模式共享存储集群部署 环境说明 操作系统&#xff1a;centos7.6 服务器&#xff1a;2台虚拟机 达梦数据库版本&#xff1a;达梦V8 安装前准备工作 参考文档《DM8共享存储集群》-第11、12章节 参考文档《DM8_Linux服务脚本使用手册》 1、系统环境(all nodes) 1…

Hive3:基本介绍

一、概述 Apache Hive是一款分布式SQL计算的工具&#xff0c; 其主要功能是&#xff1a; 将SQL语句翻译成MapReduce程序运行 Hive是单机工具&#xff0c;只需要部署在一台服务器即可。 Hive虽然是单机的&#xff0c;但是它可以提交分布式运行的MapReduce程序运行。 二、基本…

7月23日JavaSE学习笔记

异常&#xff1a; 程序中一些程序处理不了的特殊情况 异常类 Exception 继承自 Throwable 类&#xff08;可抛出的&#xff09; Throwable继承树 Error&#xff1a;错误/事故&#xff0c;Java程序无法处理&#xff0c;如 OOM内存溢出错误、内存泄漏...会导出程序崩溃 常见的…

C++客户端Qt开发——Qt窗口(对话框)

5.对话框 ①对话框介绍 对话框是GUI程序中不可或缺的组成部分。一些不适合在主窗口实现的功能组件可以设置在对话框中。对话框通常是一个顶层窗口&#xff0c;出现在程序最上层&#xff0c;用于实现短期任务或者简洁的用户交互。Qt常用的内置对话框有&#xff1a;QFiledialog…

【NLP自然语言处理】为什么说BERT是bidirectional

首先&#xff0c;来看一下Transformer架构图&#xff1a; 我们知道&#xff0c;Bert设计时主要采用的是Transformer编码器部分&#xff0c;要论述Bert为啥是双向的&#xff0c;我想从编码器和解码器的注意力机制来阐述。 在看这篇博客前&#xff0c;需要对Transformer有一定的…

如何录制电脑内部声音?全方位介绍电脑录音软件:8款在线录音!(2024重新整理)

如何录制电脑内部声音&#xff1f;不管是娱乐圈还是现实生活&#xff0c;【录音】这个功能的重要性不言而喻。而电脑录音已在影视配音、音视频剪辑、会议记录、在线教育等多个领域发光发热&#xff01; 本文将为您推荐8款电脑录音软件&#xff0c;并详细介绍电脑录音的多种方式…

【Windows和Linux校验文件MD5值(详细)】

1、 什么是MD5&#xff1f; 文件的MD5校验是一种常用的文件完整性验证方法。MD5&#xff08;Message Digest Algorithm 5&#xff09;是一种广泛应用的哈希算法&#xff0c;它能够将任意长度的数据转换为固定长度的哈希值。在文件校验中&#xff0c;MD5算法通过计算文件的哈希…

访问所有节点的最短路径

847. 访问所有节点的最短路径 存在一个由 n 个节点组成的无向连通图&#xff0c;图中的节点按从 0 到 n - 1 编号。 给你一个数组 graph 表示这个图。其中&#xff0c;graph[i] 是一个列表&#xff0c;由所有与节点 i 直接相连的节点组成。 返回能够访问所有节点的最短路径的…

【吊打面试官系列-Dubbo面试题】服务调用是阻塞的吗?

大家好&#xff0c;我是锋哥。今天分享关于 【服务调用是阻塞的吗&#xff1f;】面试题&#xff0c;希望对大家有帮助&#xff1b; 服务调用是阻塞的吗&#xff1f; 默认是阻塞的&#xff0c;可以异步调用&#xff0c;没有返回值的可以这么做。 Dubbo 是基于 NIO 的非阻塞实现…

渗透测试:筑牢网络安全的坚固防线

在当今这个互联网高度发达的时代&#xff0c;网络安全已成为维护社会稳定和经济发展的重要基石。随着互联网的普及&#xff0c;网络攻击手段日益复杂多变&#xff0c;各类安全威胁层出不穷。为了有效应对这些挑战&#xff0c;渗透测试作为一种重要的安全测试与评估方法&#xf…

QT自定义无边框窗口(可移动控制和窗口大小调整)

QT是一个功能强大的跨平台开发框架&#xff0c;它提供了丰富的界面设计工具和组件。在界面开发中&#xff0c;QT窗口自带的标题栏无法满足我们的需求。我们就需要自定义无边框窗口&#xff0c;包括自定义标题栏和窗口大小调整功能。本文将介绍如何在QT中实现这些功能。 一、简…

AI绘画入门实践 | Midjourney:使用 --chaos 给图像风格来点惊喜

在 Midjourney 中&#xff0c;--chaos 影响初始图像网格的多样性&#xff0c;指 MJ 每次出的4张图之间的差异性。 默认值为0&#xff0c;值越高&#xff0c;差异性越大。 使用格式&#xff1a;--chaos 0-100的整数值 使用演示 a lot of flowers --chaos 0 --v 6.0a lot of fl…