被面试官吊打系列 - 事务隔离级别

2021年09月19日17:38:02 科技 1474

来源于公众号JAVA日知录 ,

作者飘渺Jam


小张兴冲冲去面试,结果被面试官吊打!

小张:面试官,你好。我是来参加面试的。

面试官:你好,小张。我看了你的简历,精通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 READOracle则采用的是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 <1010< f_id <30 的记录也无法完成,而大于等于30的记录则不受影响,这足以解决幻读问题了。

刚刚讲的是f_id 是索引列的情况,那么如果 f_id不是索引列会怎么样呢?

这时候数据库会为整个表加上间隙锁。所以,如果是没有索引的话,不管 f_id 是否大于等于30,都要等待事务A提交才可以成功插入。

面试官:好了,各位看官朋友们,事务的隔离级别这个面试点你们清楚了吗?希望你们的面试不会被这个问题难倒哟~

小张:学到了学到了,我下次再来。(赶紧回去把简历上的精通数据库给删掉。)


以上,希望对你有所帮助!

知识在于一点一滴的积累,滴水穿石!

科技分类资讯推荐

苹果visionOS 26发布:全新3D小组件可固定于环境中 - 天天要闻

苹果visionOS 26发布:全新3D小组件可固定于环境中

IT之家 6 月 10 日消息,在目前正在进行的 WWDC25 中,苹果公布了 visionOS 26。据苹果介绍,visionOS 26 带来全新 3D 小组件功能,用户可以将小组件固定在环境中。此外,visionOS 26 还新增空间场景 / 空间画廊功能,也就是利用 LiDAR 传感器打造 3D 场景,让用户置身其中,并改进了用户的“自影像”3D 头像
苹果 iOS 26 系统更新正式发布:全新液态玻璃设计、AI 功能改进 - 天天要闻

苹果 iOS 26 系统更新正式发布:全新液态玻璃设计、AI 功能改进

IT之家 6 月 10 日消息,苹果今日正式发布了 iOS 26 更新,系统命名跟上年份,带来设计、功能、AI 等多个方面的改进,IT之家汇总如下:全新外观新设计使应用和系统体验更加富有表现力和令人愉悦,同时保持了 iOS 的即时熟悉感。它采用 Liquid Glass(液态玻璃)—— 一种新的半透明材质,能够反射和折射周围环境,使内容更...
iOS 26升级视觉智能:AI识别屏幕内容,可搜索同款商品等 - 天天要闻

iOS 26升级视觉智能:AI识别屏幕内容,可搜索同款商品等

IT之家 6 月 10 日消息,在今天举办的 WWDC 2025 主题演讲中,苹果宣布升级视觉智能(Visual Intelligence),让用户能够搜索并操作 iPhone 应用中显示的任何内容。IT之家此前曾分享视觉智能的初步上手体验,主要通过相机识别现实世界中的物体,而在本次更新中,该功能可以直接分析屏幕上的内容。用户可以针对屏幕显示的图...
iPadOS 26登场:全新多任务处理/文件App比拟macOS - 天天要闻

iPadOS 26登场:全新多任务处理/文件App比拟macOS

IT之家 6 月 10 日消息,在目前正在进行的 WWDC25 中,苹果公布了 iPadOS 26。iPadOS 26 集中于多任务处理(相应功能支持 iPad 全系家族),带来了类似 macOS 的左上角“红绿灯”,用户打开 App 时应用首先会全屏显示,但用户也可以通过应用右下角来调整应用窗口大小,在连接键盘后,还支持通过鼠标来直观拖拽界面,点击“...
苹果预告 AirPods 新功能:录音室级录音 + 相机遥控 - 天天要闻

苹果预告 AirPods 新功能:录音室级录音 + 相机遥控

IT之家 6 月 10 日消息,在今天召开的 WWDC 2025 全球开发者大会上,苹果为 AirPods 4、AirPods 4(支持主动降噪 ANC)以及 AirPods Pro 2 耳机,预告了音频录制和相机遥控功能。录音室级别音频录制苹果公司表示无论是采访者、播客主播还是歌手,AirPods 用户都能随时随地录制录音室级别的高品质音频。IT之家援引博
这下惨了,特朗普的大棋下不下去了 - 天天要闻

这下惨了,特朗普的大棋下不下去了

特朗普的真正秘密是什么?今天通过3个故事来全面解构! 坏土豆 作品首发于头条号 一个坏土豆陪我的国一起逆袭每次我写时评的时候,总有人说人家马斯克是世界首富,不比你聪明,不比你眼光长远。人家特朗普,堂堂美国总统,不比你深谋远虑,你看不懂是因为
苹果发布Foundation模型框架 - 天天要闻

苹果发布Foundation模型框架

IT之家 6 月 10 日消息,正在举行的 WWDC 2025 开发者大会上,苹果公司以 Apple Intelligence 为开场,宣布推出 Foundation Models 框架。
阿尔特汽车进军智能机器人领域,多款产品研发中 - 天天要闻

阿尔特汽车进军智能机器人领域,多款产品研发中

IT之家 6 月 10 日消息,阿尔特汽车 6 月 8 日宣布正式进军机器人产业,该公司最新战略布局取得突破性进展 —— 由阿尔特联合云视科技、上海乙蜂共同投资的北京阿尔瑞特智能机器人科技有限公司(以下简称阿尔瑞特)已完成注册并举行成立庆典。阿尔特机器人业务由阿尔特董事长宣奇武亲自挂帅,并由思科系统前高管张毅军等具...