面试官问我MySQL事务的底层原理?幸亏我总结了全套八股文
迎面走来了你的面试官,身穿格子衫,挺着啤酒肚,发际线严重后移的中年男子。
手拿泡着枸杞的保温杯,胳膊夹着MacBook,MacBook上还贴着公司标语:“我爱加班”。
面试开始,直入正题。
面试官: 看你简历上面写着精通MySQL,我先问你事务的特性是什么?
老生常谈,这个还有谁不会背的吗?
我: 这个我知道,事务有四大特性,分别是原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability),简称ACID。
原子性是指事务中所有操作要么全部成功,要么全部失败。
一致性是指事务执行前后,数据始终处于一致性状态,不会出现数据丢失。
隔离性是指事务提交前的中间状态对其他事务不可见,即相互隔离。
持久性是指事务提交后,数据的修改永久保存在数据库中。
面试官: 嗯,回答得不错。那你知道MySQL底层是怎么实现事务的四大特性?
这道题有点深了,需要背会redo log、undo log、mvcc。
千万别说不知道这几个东西是干嘛用的。
不但要知道,还要跟事务扯上关系。
我: 原子性是undo log实现的,一致性是由代码逻辑层面保证的,隔离性是由mvcc实现的,持久性是基于redo log实现的。
Redo Log(重做日志):
Redo Log记录的是物理日志,也就是磁盘数据的修改。
用来保证服务崩溃后,仍能把事务中变更的数据持久化到磁盘上。
如果没有Redo Log的话,会发生什么?
修改数据的过程就变成这样了:
- 从磁盘加载数据到内存
- 在内存中修改数据
- 把新数据持久化到磁盘
这样做,会有严重的性能问题。
- InnoDB在磁盘中存储的基本单元是页,可能本次修改只变更一页中几个字节,但是需要刷新整页的数据,就很浪费资源。
- 一个事务可能修改了多页中的数据,页之间又是不连续的,就会产生随机IO,性能更差。
所以为了提高写入性能,于是就引入了Redo Log。
看一下引入Redo Log后修改流程:
- 从磁盘加载数据到内存
- 在内存中修改数据
- 把新数据写到Redo Log Buffer中
- 把Redo Log Buffer中数据持久化到Redo Log文件中
- 把Redo Log文件中数据持久化到数据库磁盘中
Undo Log(回滚日志):
Undo Log记录的是逻辑日志,用来回滚事务时,恢复到修改前的数据。
比如:当我们执行一条insert语句时,Undo Log就记录一条相反的delete语句。
加入Undo Log之后的修改流程就是这样的:
MVCC(多版本并发控制,Multi-Version Concurrency Control):
记录的是某个时间点上的数据快照,用来实现不同事务之间数据的隔离性。
提到隔离性,一定要说一下事务的隔离级别。
说事务隔离级别之前,必须要先说一下并发事务产生的问题:
脏读: 一个事务读到其他事务未提交的数据。
不可重复读: 多次读取相同的数据,得到的结果集不一致,即读到其他事务提交后的数据。
幻读: 相同的查询条件,多次读取的结果不一致,即读到其他事务提交后的数据。
不可重复读与幻读的区别是: 不可重复读是读到了其他事务执行update、delete后的数据,而幻读是读到其他事务执行insert后的数据。
隔离级别
Read UnCommitted(读未提交): 读到其他事务未提交的数据,会出现脏读、不可重复读、幻读。
Read Committed(读已提交): 读到其他事务已提交的数据,解决了脏读,会出现不可重复读、幻读。
Repeatable Read(可重复读): 相同的数据,多次读取到的结果集一致。解决了不可重复读,还是会出现幻读。
Serializable(串行化): 所有事务串行执行,解决了幻读。
再谈MVCC:
MVCC解决了读写冲突,实现了读写并行,提升了事务的性能。
由于Read UnCommitted隔离级别下,每次都读取最新的数据。而Serializable隔离级别下,对所有读取数据都加锁。这两种隔离级不需要MVCC,所以MVCC只在Read Committed和Repeatable Read两种隔离级别下起作用。
MVCC的实现方式通过两个隐藏列trx_id(最近一次提交事务的ID)和roll_pointer(上个版本的地址),建立一个版本链。并在事务中读取的时候生成一个ReadView(读视图),在Read Committed隔离级别下,每次读取都会生成一个读视图,而在Repeatable Read隔离级别下,只会在第一次读取时生成一个读视图。
InnoDB如何解决幻读的?
先普及一下快照读和当前读。
当前读: 读取数据的最新版本,并对数据进行加锁。
例如:insert、update、delete、select for update
快照读: 读取数据的历史版本,不对数据加锁。
例如:select
在当前读的情况下,是通过加锁来解决幻读。
在快照读的情况下,是通过MVCC来解决幻读。
面试官: 还得是你,就你总结的全。今天的面试先到这吧,下一面要问你MySQL的锁,你准备一下。
本文知识点总结:
面试官问我MySQL事务的底层原理?幸亏我总结了全套八股文相关推荐
- 从面试官问“为什么选择mysql数据库”说开去
前几天面试,面试官问我:"为什么选择mysql数据库".现在想想,有如下的问题需要解决 关系型数据库有什么特点及举例 非关系型数据库有什么特点及举例 关系型数据库与非关系型数据库有 ...
- redis怎么修改_面试官问我Redis事务,还问我有哪些实现方式
❝ 「第12期」 距离大叔的80期小目标还有68期,今天大叔要跟大家分享的内容是 -- Reids中的事务.同样,这也是redis中重要指数为四颗星的必备基础知识点.下面一起来了解一下吧. ❞ 相信大 ...
- 蚂蚁金服二面:面试官问我零拷贝的实现原理,当场跪。。。
本文来源:占小狼的博客 "狼哥,面试又跪了,碰到了知识盲区" "哪个?" "一面还可以,二面面试官问我零拷贝的原理,懵逼了...这块内容没去研究过&q ...
- 5月面试美团面试官问到MySQL时我竟无言以对,闭关42天,再战美团
MySQL 作为主流的数据库,在业务开发中有着举足轻重的地位.绝大部分一线企业,尤其是电商大厂,在线交易业务这块,如订单.支付系统,都离不开 MySQL 这种金融级的关系型数据库.因此在选用人才时,大 ...
- 面试官问:MySQL 的自增 ID 用完了,怎么办?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:程序猿面试指南 既然这块知识点不清楚,那回头就自己动手实践下 ...
- 为什么不用mysql版本号加锁_面试必问的Mysql事务和锁,你真的了解吗?
前言 本文内容 事务的定义和作用,隔离级别 MVCC 是什么,快照读和加锁读 锁分类,行锁,意向锁,怎么查看 Mysql 锁的信息 悲观锁和乐观锁的使用场景 Mysql 的版本为 8.0.17. 事务 ...
- 面试刷题29:mysql事务隔离实现原理?
mysql的事务是innodb存储引擎独有的,myisam存储引擎不支持事务. 事务最经典的例子就是转账了,事务要保证的是一组数据库的操作要么全部成功,要么全部失败.是为了保证高并发场景下数据的正确性 ...
- 事物的级别_面试官问:MySQL锁与事物隔离级别你知道吗?
本文作者:何建辉(公众号:org_yijiaoqian) 点赞再看,养成习惯,微信搜一搜[一角钱小助手]关注更多原创技术文章. 本文 GitHub org_hejianhui/JavaStudy 已收 ...
- 面试官问:MySQL锁与事物隔离级别你知道吗?
点赞再看,养成习惯,微信搜一搜[一角钱小助手]关注更多原创技术文章. 本文 GitHub org_hejianhui/JavaStudy 已收录,有我的系列文章. 前言 MySQL索引底层数据结构与算 ...
最新文章
- 什么是锚文本以及锚文本连接
- JavaScript原理学习
- 关于Apache不能解析html内容
- 解压与压缩ramdisk.img文件
- QDoc主题命令Topic Commands
- c语言指针数组课件,C语言指针与数组教程课件.ppt
- 洛谷P3405 [USACO16DEC]Cities and States省市
- FL Studio常见问题之通道窗口和步进音序器的设置
- Bootstrap 编译版文件结构
- Android实现按两次back键退出应用
- 一本通1623Sherlock and His Girlfriend
- [JAVA]全新java初学者实践教程(全)
- matlab用ezplot绘制参数方程,MATLAB学习1 之画图函数
- ClearCase截取
- 记一次ASP绕过WTS-WAF
- 迭代回溯的图最大团问题(可得到多组最优解)
- 【strlen函数的使用及strlen函数的三种模拟实现】· C语言详解库函数篇(一)
- 前端之 HTML 知识点扫盲
- 网易云音乐 linux x32,网易云音乐 Win10 UWP 正式变为 Win32 转制版
- (二)机器学习的流程概述,线性规划,图像分类