事务与日志 - MySQL 面试题及答案
16.什么是事务?其特性是什么?
事务是指是程序中一系列操作必须全部成功完成,有一个失败则全部失败。

特性
- 「1.原子性(Atomicity)」:要么全部执行成功,要么全部不执行。
- 「2.一致性(Consistency)」:事务前后数据的完整性必须保持一致。
- 「3.隔离性(Isolation)」:隔离性是当多个事务同事触发时,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
- 「4.持久性(Durability)」:事务完成之后的改变是永久的。
17.事务的隔离级别?
- 1.「读提交」:即能够**「读取到那些已经提交」**的数据
- 2.「读未提交」:即能够**「读取到没有被提交」**的数据
- 3.「可重复读」:可重复读指的是在一个事务内,最开始读到的数据和事务结束前的**「任意时刻读到的同一批数据都是一致的」**
- 4.「可串行化」:最高事务隔离级别,不管多少事务,都是**「依次按序一个一个执行」**

- 「脏读」
- 脏读指的是**「读到了其他事务未提交的数据」**,未提交意味着这些数据可能会回滚,也就是可能最终不会存到数据库中,也就是不存在的数据。读到了并一定最终存在的数据,这就是脏读
- 「不可重复读」
- 对比可重复读,不可重复读指的是在同一事务内,「不同的时刻读到的同一批数据可能是不一样的」。
- 「幻读」
- 幻读是针对数据插入(INSERT)操作来说的。假设事务A对某些行的内容作了更改,但是还未提交,此时事务B插入了与事务A更改前的记录相同的记录行,并且在事务A提交之前先提交了,而这时,在事务A中查询,会发现**「好像刚刚的更改对于某些数据未起作用」**,但其实是事务B刚插入进来的这就叫幻读
18.binlog 是做什么的?
binlog 是归档日志,属于 Server 层的日志,是一个二进制格式的文件,用于**「记录用户对数据库更新的SQL语句信息」**。
主要作用
- 主从复制
- 数据恢复
19.undolog 是做什么的?
undolog 是 InnoDB 存储引擎的日志,用于保证数据的原子性,「保存了事务发生之前的数据的一个版本,也就是说记录的是数据是修改之前的数据,可以用于回滚」,同时可以提供多版本并发控制下的读(MVCC)。
主要作用
- 事务回滚
- 实现多版本控制(MVCC)
20.relaylog 是做什么的?
relaylog 是中继日志,「在主从同步的时候使用到」,它是一个中介临时的日志文件,用于存储从master节点同步过来的binlog日志内容。

master 主节点的 binlog 传到 slave 从节点后,被写入 relay log 里,从节点的 slave sql 线程从 relaylog 里读取日志然后应用到 slave 从节点本地。从服务器 I/O 线程将主服务器的二进制日志读取过来记录到从服务器本地文件,然后 SQL 线程会读取 relay-log 日志的内容并应用到从服务器,从而**「使从服务器和主服务器的数据保持一致」**。
21.redolog 是做什么的?
redolog 是 「InnoDB 存储引擎所特有的一种日志」,用于记录事务操作的变化,记录的是数据修改之后的值,不管事务是否提交都会记录下来。
可以做**「数据恢复并且提供 crash-safe 能力」**
当有增删改相关的操作时,会先记录到 Innodb 中,并修改缓存页中的数据,「等到 mysql 闲下来的时候才会真正的将 redolog 中的数据写入到磁盘当中」。
22.redolog 是怎么记录日志的?

InnoDB 的 redo log 是固定大小的,比如可以配置为一组4个文件,每个文件的大小是1GB,那么总共就可以记录4GB的操作。「从头开始写,写到末尾就又回到开头循环写」。
所以,如果数据写满了但是还没有来得及将数据真正的刷入磁盘当中,那么就会发生**「内存抖动」**现象,从肉眼的角度来观察会发现 mysql 会宕机一会儿,此时就是正在刷盘了。
23.redolog 和 binlog 的区别是什么?

- 1.「redolog」 是 「Innodb」 独有的日志,而 「binlog」 是 「server」 层的,所有的存储引擎都有使用到
- 2.「redolog」 记录了**「具体的数值」,对某个页做了什么修改,「binlog」** 记录的**「操作内容」**
- 3.「binlog」 大小达到上限或者 flush log 「会生成一个新的文件」,而 「redolog」 有固定大小**「只能循环利用」**
- 4.「binlog 日志没有 crash-safe 的能力」,只能用于归档。而 redo log 有 crash-safe 能力。
24.说一说 mvcc 吧,有什么作用?
MVCC:多版本并发控制,是现代数据库(包括 MySQL、Oracle、PostgreSQL 等)引擎实现中常用的处理读写冲突的手段,目的在于**「提高数据库高并发场景下的吞吐性能」**。
在 MVCC 协议下,每个读操作会看到一个一致性的快照,「这个快照是基于整个库的」,并且可以实现非阻塞的读,用于**「支持读提交和可重复读隔离级别的实现」**。
MVCC 允许数据具有多个版本,这个版本可以是时间戳或者是全局递增的事务 ID,在同一个时间点,不同的事务看到的数据是不同的,这个修改的数据是**「记录在 undolog 中」**的。
点击这里👇🏻:复杂的微服务系统、商城系统、代码生成工具实战、秒杀系统、常用demo系统、AI项目等等,手把手从0~1,带你开发完整的项目,这里能够获取项目源代码、开发教程、部署文档和问题答疑
最近建一些几十个工作内推群,各大城市都有,群里目前已经收集了很多内推岗位,大厂、中厂、小厂、外包都有。 欢迎HR、开发、测试、运维和产品加入。

扫描下方微信,备注:网站+所在城市,即可拉你进工作内推群。
