迎面走来了你的面试官,身穿格子衫,挺着啤酒肚,发际线严重后移的中年男子。
手拿泡着枸杞的保温杯,胳膊夹着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的话,会发生什么?

修改数据的过程就变成这样了:

  1. 从磁盘加载数据到内存
  2. 在内存中修改数据
  3. 把新数据持久化到磁盘

这样做,会有严重的性能问题。

  1. InnoDB在磁盘中存储的基本单元是页,可能本次修改只变更一页中几个字节,但是需要刷新整页的数据,就很浪费资源。
  2. 一个事务可能修改了多页中的数据,页之间又是不连续的,就会产生随机IO,性能更差。

所以为了提高写入性能,于是就引入了Redo Log。

看一下引入Redo Log后修改流程:

  1. 从磁盘加载数据到内存
  2. 在内存中修改数据
  3. 把新数据写到Redo Log Buffer
  4. Redo Log Buffer中数据持久化到Redo Log文件中
  5. 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事务的底层原理?幸亏我总结了全套八股文相关推荐

  1. 从面试官问“为什么选择mysql数据库”说开去

    前几天面试,面试官问我:"为什么选择mysql数据库".现在想想,有如下的问题需要解决 关系型数据库有什么特点及举例 非关系型数据库有什么特点及举例 关系型数据库与非关系型数据库有 ...

  2. redis怎么修改_面试官问我Redis事务,还问我有哪些实现方式

    ❝ 「第12期」 距离大叔的80期小目标还有68期,今天大叔要跟大家分享的内容是 -- Reids中的事务.同样,这也是redis中重要指数为四颗星的必备基础知识点.下面一起来了解一下吧. ❞ 相信大 ...

  3. 蚂蚁金服二面:面试官问我零拷贝的实现原理,当场跪。。。

    本文来源:占小狼的博客 "狼哥,面试又跪了,碰到了知识盲区" "哪个?" "一面还可以,二面面试官问我零拷贝的原理,懵逼了...这块内容没去研究过&q ...

  4. 5月面试美团面试官问到MySQL时我竟无言以对,闭关42天,再战美团

    MySQL 作为主流的数据库,在业务开发中有着举足轻重的地位.绝大部分一线企业,尤其是电商大厂,在线交易业务这块,如订单.支付系统,都离不开 MySQL 这种金融级的关系型数据库.因此在选用人才时,大 ...

  5. 面试官问:MySQL 的自增 ID 用完了,怎么办?

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 来源:程序猿面试指南 既然这块知识点不清楚,那回头就自己动手实践下 ...

  6. 为什么不用mysql版本号加锁_面试必问的Mysql事务和锁,你真的了解吗?

    前言 本文内容 事务的定义和作用,隔离级别 MVCC 是什么,快照读和加锁读 锁分类,行锁,意向锁,怎么查看 Mysql 锁的信息 悲观锁和乐观锁的使用场景 Mysql 的版本为 8.0.17. 事务 ...

  7. 面试刷题29:mysql事务隔离实现原理?

    mysql的事务是innodb存储引擎独有的,myisam存储引擎不支持事务. 事务最经典的例子就是转账了,事务要保证的是一组数据库的操作要么全部成功,要么全部失败.是为了保证高并发场景下数据的正确性 ...

  8. 事物的级别_面试官问:MySQL锁与事物隔离级别你知道吗?

    本文作者:何建辉(公众号:org_yijiaoqian) 点赞再看,养成习惯,微信搜一搜[一角钱小助手]关注更多原创技术文章. 本文 GitHub org_hejianhui/JavaStudy 已收 ...

  9. 面试官问:MySQL锁与事物隔离级别你知道吗?

    点赞再看,养成习惯,微信搜一搜[一角钱小助手]关注更多原创技术文章. 本文 GitHub org_hejianhui/JavaStudy 已收录,有我的系列文章. 前言 MySQL索引底层数据结构与算 ...

最新文章

  1. 什么是锚文本以及锚文本连接
  2. JavaScript原理学习
  3. 关于Apache不能解析html内容
  4. 解压与压缩ramdisk.img文件
  5. QDoc主题命令Topic Commands
  6. c语言指针数组课件,C语言指针与数组教程课件.ppt
  7. 洛谷P3405 [USACO16DEC]Cities and States省市
  8. FL Studio常见问题之通道窗口和步进音序器的设置
  9. Bootstrap 编译版文件结构
  10. Android实现按两次back键退出应用
  11. 一本通1623Sherlock and His Girlfriend
  12. [JAVA]全新java初学者实践教程(全)
  13. matlab用ezplot绘制参数方程,MATLAB学习1 之画图函数
  14. ClearCase截取
  15. 记一次ASP绕过WTS-WAF
  16. 迭代回溯的图最大团问题(可得到多组最优解)
  17. 【strlen函数的使用及strlen函数的三种模拟实现】· C语言详解库函数篇(一)
  18. 前端之 HTML 知识点扫盲
  19. 网易云音乐 linux x32,网易云音乐 Win10 UWP 正式变为 Win32 转制版
  20. (二)机器学习的流程概述,线性规划,图像分类

热门文章

  1. 打开Sql数据库文件(扩展名为mdf)
  2. Mac OS X RAM Disk(内存盘) Shell
  3. ISO27002新版标准变化解读
  4. 安装2019Pycharm最新版本-详细教程--激活码
  5. 用友ERP T6技术解析(五)产成品入库
  6. 三天打鱼两天晒网问题(C++)
  7. Java识别PDF文字内容的方法
  8. Unity3D支持导入的模型格式
  9. T560和为k的子数组
  10. matlab中polyval与polyvalm函数的区别