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

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提交才可以成功插入。

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

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


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

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

科技分类资讯推荐

无线信号增强秘籍,桥接和中继模式哪个更强? - 天天要闻

无线信号增强秘籍,桥接和中继模式哪个更强?

【ZOL中关村在线原创技术解析】随着无线通信与计算机技术飞速发展,人们愈发渴望随时随地享受稳定的数据通信服务。无线路由器作为无线网络核心设备,作用关键。但当其信号覆盖不足,如穿过两堵墙后信号微弱时,可通过无线桥接或中继模式连接两个无线路由器,扩展网络、增强信号。中继模式和桥接模式虽都能扩展网络覆盖,但...
流畅更耐用 魅族Note 16将预装Flyme 12 - 天天要闻

流畅更耐用 魅族Note 16将预装Flyme 12

魅族官方透露,将于5月发布的魅族Note 16系列将出厂预装Flyme 12新系统,这也是Flyme系统大版本首次在非旗舰机型上首发。魅族Note 16搭载紫光展锐T765处理器,配备6.78英寸LCD屏,分辨率达2460*1080。后置采用八边形相机模组,由5000万像素主摄和200万像素镜头组成。续航方面,内置6600mAh大容量电池,支持40W有线充电
跨境电商迎“成本地震”,行业洗牌加速 - 天天要闻

跨境电商迎“成本地震”,行业洗牌加速

【环球网财经综合报道】近日,美国正式终止了对中国价值不超过800美元的小额包裹免征关税的政策,这一变化引发了中国跨境电商行业的连锁反应。多家物流公司随即调整策略,物流费用普遍上涨,并增加了高额预收税金。(图片来源:东方IC)美国的800美元小额免税政策(De Minimis)自2016年实施以来,极大地推动了全球跨境电商...
音乐节超时粉丝吵上热搜!罗云熙周深发布联合说明 - 天天要闻

音乐节超时粉丝吵上热搜!罗云熙周深发布联合说明

5月4日,太湖湾音乐节组委会“关于5月1日太湖湾音乐节的相关讨论”,联合罗云熙工作室、周深工作室作出如下说明:在演出过程中,现场因节奏调整产生变化,相关团队均已积极协作,确保了整体流程顺利完成。对于由此引发的相关关注,我们充分理解大家的关心
国外一公司推出“空中自行车”:可垂直起飞、极速200公里/时 - 天天要闻

国外一公司推出“空中自行车”:可垂直起飞、极速200公里/时

快科技5月5日消息,近日,国外一家名为Volonaut的新成立公司推出了一款 “空中自行车”,这是一款具有创新性和颠覆性的飞行载具。其由Jetson One(注:一款飞行器)创造者托马斯・帕坦(Tomasz Patan)在波兰研发,其设计灵感源自科幻电影,尤其是《星球大战》中的飞行摩托。外观上没有传统飞行器的冗余结构,仅见容纳推进...
全球首款双形态人形机器人正式发布! - 天天要闻

全球首款双形态人形机器人正式发布!

前言首次定义具身人形机器人商用范式。近日消息,全球首款双形态人形机器人——数字华夏IP系列开山之作星行侠P01正式发布。颜值高、智商高、易使用首次定义具身人形机器人商用范式据悉,数字华夏推出IP系列的初衷,是打造属于这个时代的“商用机器人”。“外形潮流时尚、智商情商兼具、使用维护极简,首次定义具身人形机...
三星One UI 8测试版或下月推出 给后续修复留出时间 - 天天要闻

三星One UI 8测试版或下月推出 给后续修复留出时间

【CNMO科技消息】三星已经开始内部测试全新的One UI 8系统,同时也在包括Galaxy Z Flip6在内的多款设备上进行适配测试。按照目前的进度来看,这次更新的到来时间可能比很多人预想得更早,有可能会在今年7月或8月之前就正式推出。 和以往一样,三星应该会先上线One UI 8的测试版计划,给部分用户提前尝鲜的机会。根据最新消...
苹果引入Anthropic开发的Claude AI系统 欲放弃自研? - 天天要闻

苹果引入Anthropic开发的Claude AI系统 欲放弃自研?

【CNMO科技消息】苹果最近开始引入Anthropic公司开发的Claude AI系统,用于协助其工程师更高效地编写代码。 长期以来,苹果一直坚持自主研发核心技术,很少依赖外部力量。但这一次,它选择与Anthropic合作,将后者的Claude Sonnet模型集成到自家开发工具Xcode的升级版本中。据彭博社报道,这项合作已经开始在内部落地,主要...
6 大升级!Apple Watch SE 3 入门款到底有多能打? - 天天要闻

6 大升级!Apple Watch SE 3 入门款到底有多能打?

文 | 路边同学还有 4 个月,苹果将推出新一代入门级智能手表 —— Apple Watch SE 3。这款原计划在 2024 年发布的机型,因市场节奏调整延后至今,却也让外界对其升级细节有了更充分的爆料空间。