面试被吊打系列 - 事务隔离级别
小伙伴们有没有觉得学习数据库很有意思?有意思就对了!今天就给大家带来《面试被吊打系列 - 事务隔离级别》,以下内容将会涉及到MySQL、面试、事务,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到你!
小张兴冲冲去面试,结果被面试官吊打!
小张:面试官,你好。我是来参加面试的。
面试官:你好,小张。我看了你的简历,精通MySQL数据库。那你肯定知道事务吧,你能说说 事务有哪些特性 吗?
小张:一个事务有4个特性,即ACID。
- 原子性(Atomicity): 事务开始后的所有操作,要么全部成功要么全部失败。
- 一致性(Consistency): 事务开始前后数据库的完整性约束没有被破坏,比如:A向B转钱,不可能出现A扣了钱,B没收到钱。
- 隔离性(Isolation):多个事务并发访问时,事务之间是隔离的。
- 持久性(Durability):事务完成后,事务对数据库的操作被保存在了数据库,不能回滚。
面试官:嗯,答的很对。那你说说事务有哪几种隔离级别呢?
小张:事务隔离级别从高到低有四种隔离级别,分别是:串行化(SERIALIZABLE) 、可重复读(REPEATABLE READ)、读提交(READ COMMITTED)、读未提交(READ UNCOMMITTED)。
面试官:嗯嗯,那你能说说这四种隔离级别分别会造成什么问题吗?
(小张窃喜,我就知道你要这么问,还好我平时关注了 ‘ JAVA日知录 ’ 的公众号)
小张:好的,面试官。
如果数据库采用 读未提交(READ UNCOMMITTED)这种隔离级别,会造成 脏读。事务还没提交别人就能看到,这样就不能保证你读取到的数据是最终的数据,万一别人把事务回滚了,那就出现了脏数据问题。
读提交(READ COMMITTED)是指一个事务只能读取到其他事务已经提交了的数据,这样就不会出现脏读的问题,但是它会带来」不可重复读 的问题。比如 A事务 将一个人的姓名从张三改成李四,B事务在A事务提交之前读取到的是张三,但是在A事务提交之后就变成了李四。
可重复读(REPEATABLE READ):可重复读是为了解决READ COMMITTED带来的不可重复读问题,指的是事务不会读取到其他事务对已有数据的修改,即使数据已经提交了。也就是说事务开始读取到的是什么,在事务提交之前的任意时刻,这些数据都一样。虽然解决了不可重复读问题,但是他又会带来 幻读 的问题。比如A事务将张三修改成李四,B事务再插入一个名叫李四的用户,此时事务A再查找名叫李四的用户会发现多了一条,出现了2个李四,这就是幻读。
串行化(SERIALIZABLE):解决了上面出现的所有问题,但是它效率最差,它将事务的执行变成顺序执行了。
面试官:回答的不错,那你知道 MySQL的默认隔离级别是什么吗?
小张:Mysql默认的隔离级别是REPEATABLE READ,Oracle则采用的是READ COMMITTED。
面试官:但是我们使用MySQL的时候并没有出现幻读啊,怎么解决的?
小张擦了擦汗,开始有点紧张了:额,InnoDB主要是利用锁来解决幻读问题的。
面试官:对,是采用了锁,那么具体怎么实现的呢?

小张:我...我突然有点事,我先回去了。
面试官:要了解InnoDB怎么解决幻读得先知道InnoDB有哪几种锁。
- Record Lock:单个行记录上的锁
- Gap Lock:间隙锁,锁定一个范围,而非记录本身,遵循左开右闭原则
- Next-Key Lock:结合Gap Lock和Record Lock,锁定一个范围,并且锁定记录本身。主要解决的问题是REPEATABLE READ隔离级别下的幻读。
注意,如果走唯一索引,那么Next-Key Lock会降级为Record Lock,即仅锁住索引本身,而不是范围。也就是说Next-Key Lock前置条件为事务隔离级别为RR且查询的索引走的非唯一索引、主键索引。
下面我们通过具体的例子来模拟上面出现的幻读问题:
`CREATE TABLE T (id int ,name varchar(50),f_id int,PRIMARY KEY (id), KEY(f_id)) ENGINE=InnoDB DEFAULT CHARSET=utf8` `insert into T SELECT 1,'张三',10;` `insert into T SELECT 2,'李四',30;`
InnoDB在数据库中会为索引维护一套B+树,用来快速定位行记录。B+索引树是有序的,所以会把这张表的索引分割成几个区间。

事务A执行如下语句,需要将张三修改成李四。
`select * from t;` `update t set name = '李四' where f_id = 10;`
这时SQL语句走非唯一索引,因此使用
Next-Key Lock加锁,不仅会给f_10=10的行加上行锁,而且还会给这条记录的两边添加上间隙锁,即(-∞,10]、(10,30]这2个区间都加了间隙锁。

此时如果B事务要执行如下语句,都会报错
[Err] 1205 - Lock wait timeout exceeded; try restarting transaction
`INSERT INTO T SELECT 3,'王五',10; -- 满足行锁,执行阻塞` `INSERT INTO T SELECT 4,'赵六',8; -- 满足间隙锁,执行阻塞` `INSERT INTO T SELECT 5,'孙七',18; -- 满足间隙锁,执行阻塞`
不仅插入 f_id = 10 的记录需要等待事务A提交,
f_id 、<pre class="brush:go;">10 的记录也无法完成,而大于等于30的记录则不受影响,这足以解决幻读问题了。<blockquote>刚刚讲的是f_id 是索引列的情况,那么如果 f_id不是索引列会怎么样呢?</blockquote><p>这时候数据库会为整个表加上间隙锁。所以,如果是没有索引的话,不管 f_id 是否大于等于30,都要等待事务A提交才可以成功插入。</p><p>面试官:好了,各位看官朋友们,事务的隔离级别这个面试点你们清楚了吗?希望你们的面试不会被这个问题难倒哟~</p><p>小张:学到了学到了,我下次再来。(赶紧回去把简历上的精通数据库给删掉。)</p><p>以上,希望对你有所帮助!</p><hr><p>这里为大家准备了一份小小的礼物,关注公众号,输入如下代码,即可获得百度网盘地址,无套路领取! </p><p>001:《程序员必读书籍》 <br>002:《从无到有搭建中小型互联网公司后台服务架构与运维架构》 <br>003:《互联网企业高并发解决方案》 <br>004:《互联网架构教学视频》 <br>006:《SpringBoot实现点餐系统》 <br>007:《SpringSecurity实战视频》 <br>008:《Hadoop实战教学视频》 <br>009:《腾讯2019Techo开发者大会PPT》</p><p>010: 微信交流群</p><p></p><center><img referrerpolicy="no-referrer" src="/uploads/20230112/167352210563bfebb94a101.jpg" alt="" title="" loading="lazy"></center><p>好了,本文到此结束,带大家了解了《面试被吊打系列 - 事务隔离级别》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多数据库知识!</p>

- 上一篇
- 使用内存NewSQL数据平台来处理实时数据流的三个好处

- 下一篇
- 在苹果Mac上找不到文件存储位置怎么办?
-
- 数据库 · MySQL | 17小时前 |
- 如何检测电脑是否安装MySQL的5种方法
- 278浏览 收藏
-
- 数据库 · MySQL | 18小时前 |
- MySQL分区表查询优化技巧
- 126浏览 收藏
-
- 数据库 · MySQL | 20小时前 |
- MySQL建库语句与字符集设置教程
- 414浏览 收藏
-
- 数据库 · MySQL | 2天前 |
- MySQL中AS别名用法详解
- 320浏览 收藏
-
- 数据库 · MySQL | 2天前 |
- MySQL创建带主键的表实例
- 247浏览 收藏
-
- 数据库 · MySQL | 3天前 |
- 主外键关系怎么建立?
- 149浏览 收藏
-
- 数据库 · MySQL | 3天前 |
- MySQL中IF函数使用详解
- 392浏览 收藏
-
- 数据库 · MySQL | 4天前 |
- MySQL中IF函数使用详解
- 268浏览 收藏
-
- 数据库 · MySQL | 4天前 |
- MySQL入门:核心概念与操作全解析
- 162浏览 收藏
-
- 数据库 · MySQL | 4天前 |
- MySQL事务是什么?如何保证数据一致性?
- 349浏览 收藏
-
- 数据库 · MySQL | 4天前 |
- MySQL数据分片实现方法及常见方案解析
- 363浏览 收藏
-
- 数据库 · MySQL | 5天前 |
- MySQL基础:增删改查全教程
- 345浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 514次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 499次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 484次学习
-
- AI Mermaid流程图
- SEO AI Mermaid 流程图工具:基于 Mermaid 语法,AI 辅助,自然语言生成流程图,提升可视化创作效率,适用于开发者、产品经理、教育工作者。
- 661次使用
-
- 搜获客【笔记生成器】
- 搜获客笔记生成器,国内首个聚焦小红书医美垂类的AI文案工具。1500万爆款文案库,行业专属算法,助您高效创作合规、引流的医美笔记,提升运营效率,引爆小红书流量!
- 671次使用
-
- iTerms
- iTerms是一款专业的一站式法律AI工作台,提供AI合同审查、AI合同起草及AI法律问答服务。通过智能问答、深度思考与联网检索,助您高效检索法律法规与司法判例,告别传统模板,实现合同一键起草与在线编辑,大幅提升法律事务处理效率。
- 694次使用
-
- TokenPony
- TokenPony是讯盟科技旗下的AI大模型聚合API平台。通过统一接口接入DeepSeek、Kimi、Qwen等主流模型,支持1024K超长上下文,实现零配置、免部署、极速响应与高性价比的AI应用开发,助力专业用户轻松构建智能服务。
- 758次使用
-
- 迅捷AIPPT
- 迅捷AIPPT是一款高效AI智能PPT生成软件,一键智能生成精美演示文稿。内置海量专业模板、多样风格,支持自定义大纲,助您轻松制作高质量PPT,大幅节省时间。
- 648次使用
-
- golang MySQL实现对数据库表存储获取操作示例
- 2022-12-22 499浏览
-
- 搞一个自娱自乐的博客(二) 架构搭建
- 2023-02-16 244浏览
-
- B-Tree、B+Tree以及B-link Tree
- 2023-01-19 235浏览
-
- mysql面试题
- 2023-01-17 157浏览
-
- MySQL数据表简单查询
- 2023-01-10 101浏览