事务是 MySQL 最为重要的机制之一。
在多个并发操作同时进行时,事务可以确保数据的一致性和完整性,提高并发性能的同时,提供错误处理和回滚机制,以避免出现不可逆的问题。
事务也是 MySQL 的高频面试考点,大厂校招、社招面试90%会问到,它的重要性不言而喻。
本文是 《MySQL 事务系列篇》的集合,全面涵盖了 MySQL 事务的所有核心知识点。
MySQL 事务从入门到精通,看这一篇就够了。
一、《MySQL 事务系列篇》:知识全景图
记得【关注+收藏】哦,避免丢失,划走就找不到了。
二、《MySQL 事务系列篇》 PDF
宝妹儿以面试题的方式,将本系列更新到《MySQL 大厂高频面试题大全》PDF了,方便系统学习、面试通关。
《MySQL 大厂高频面试题大全》PDF,已收录 100+ 道 MySQL 真题,一共 78 页,近 50000 字,文末自取。
吃透它,足以应付MySQL面试。
三、《MySQL 事务系列篇》 内容
1. MySQL 事务特性及隔离级别
事务是数据库操作的一个基本单位,它由一系列的数据库操作组成,这些操作要么全部成功执行,要么全部失败回滚。
事务的目的是确保数据库操作的一致性和完整性。
MySQL 事务的 ACID 属性是指:原子性、一致性、隔离性和持久性。
一般来说,事务是必须满足这 4 个条件(ACID)。
事务的几种活动状态:
事务会带来这些并发问题:脏读、幻读、不可重复读。
针对上述并发问题,MySQL 使用了四种事务的隔离级别,用来隔离并发运行各个事务,使得它们相互不受影响,即 MySQL 事务的隔离性。
MySQL 的四种事务隔离级别分别是:读未提交、读已提交、可重复读、串行化。
2. Bin log、Redo log 和 Undo log 的区别
事务的三大重要日志 Redo Log 、Binlog、Undo log ,也是 MySQL 的重要内核。
Bin log、Redo log 和 Undo log 的区别,是 MySQL 的高频面试题,大厂校招面试90%会问。
在 MySQL 数据库中,Bin log、Redo log 和 Undo log 都是极为重要的日志文件。
MySQL InnoDB 引擎:
- 使用 redo log (重做日志)保证事务的持久性。
- 使用 Undo log (回滚日志)来保证事务的原子性。
- 使用 Bin log(归档日志)同步数据,保证数据一致性。
MySQL 实现事务、崩溃恢复、集群的主从复制等,底层都离不开日志,可以说日志是 MySQL 的内核所在。
只有了解 MySQL 日志,才算是彻底搞懂 MySQL。
详解篇:MySQL 的 Bin log、redo log 和 Undo log 的区别,2 分钟彻底搞懂!
3. MVCC 多版本并发控制
MySQL 中,MVCC (多版本并发控制)主要解决并发访问数据库带来的一系列问题。
例如:
- 读写之间阻塞的问题;
- 减少死锁的发生;
- 解决一致性读(快照读)的问题。
MVCC 可以在尽量减少锁使用的情况下,用更高效、更好的方式去处理读写冲突。即便出现了读写冲突,也可以做到不加锁、非阻塞并发读,极大提高了数据库并发性能。
MVCC 的实现主要依赖于这三个隐藏字段、Undo log 及 ReadView。
版本链在每次进行 update 或者 delete 操作时,会将每次的操作详细记录在 undo log 中。
每条 undo log 中,都记录了 rol_pointer 信息,通过 roll_pointer 进行关联,可以构成数据的版本链。
一个记录会被一堆事务进行修改,一个记录中就会存在很多 Undo log。
那对某个事务来说,这么多 Undo log,到底应该选择哪些 Undo log 执行回滚呢?
……
4. Bin log (归档日志)
Bin log (归档日志)的作用非常重要,MySQL 数据库的数据备份、主备、主主、主从都离不开 Bin log。
在 MySQL 中,不管使用什么存储引擎,只要表数据更新,就会产生 Binlog。
Bin log 保证了数据的可靠性和一致性。
详解篇:Binlog从基础到精通,24张图吃透,MySQL调优必看
Bin log 日志文件包含了索引文件和具体日志文件。
- 索引文件用于跟踪日志文件,每行一个日志文件。默认情况下,索引文件名为
{Host名}-bin.index
。 - 日志文件是由一系列事件(Binary Log Events)组成。默认情况下,文件名
为{Host名}-bin.NNNNNN
。 后缀六个数字,是编号,用于区分不同的日志文件。
Binlog 推出了三种工作模式 Statement、Row、Mixed,以满足对数据库不同场景的需求。
选型参考思路:
- 使用 MySQL 特殊功能较少,用 Statement 模式,例如存储过程、触发器、函数等,=。
- 使用 MySQL 特殊功能较多,用 Mixed 模式。
- 使用 MySQL 特殊功能较多,同时希望数据最大化一致,用 Row 模式。
……
5. 什么时候写入 Bin Log ?
Bin Log 采用预写日志 WAL,即先写日志,再写磁盘。
写入 Bin Log 之后的事务流程:
先写处于 prepare 状态的 Redo Log,事务提交后,再写处于 commit 状态的 Redo Log,即二阶段提交。
那为什么不直接持久化到磁盘呢?
直接写入磁盘会严重影响到性能:
……..
详解篇:MySQL的Bin log、redo log和Undo log的区别,2分钟彻底搞懂!
6. 基于 Binlog 实现 MySQL 的主从复制
复制是 MySQL 最重要的功能之一,MySQL 集群的高可用、负载均衡和读写分离都是基于复制来实现的。
Binlog 是实现主从复制的关键,主数据库将修改操作记录到 Binlog 中,从数据库通过解析 Binlog 实现数据的同步。
MySQL 主从复制中的主要线程:
- master(Binlog dump thread)
- slave(I/O thread 、SQL thread)
- Master 的一条线程
- Slave 中的两条线程
Binlog 主从复制的实现步骤,为了便于理解,我们结合示例一起看。
……
详解篇:Binlog实现MySQL复制,5个关键步骤,务必掌握!
7. Undo log 的概念、存储机制、原理
Undo log 是 MySQL 实现事务的关键机制之一。
Undo log 是事务原子性和一致性的保证,在事务中更新数据的前置操作,其实就是要先写入一个 Undo Log 。
本文将通过技术原理图解析:Undo Log 的存储机制、工作原理。
Undo log 的存储机制:
在 undo log 中,存放着数据更新前的记录,以及 RowID、事务ID、回滚指针的记录。
事务 ID 每次递增,如果回滚指针第一次是 insert 语句,回滚指针为 NULL,在第二次 update 之后,undo log 的回滚指针就会指向刚才的 undo log 日志。
以此类推,就形成了 undo log 的回滚链,这样就能十分便捷地查询到该条记录的历史版本了。
Undo log 的工作原理
Undo Log 属于逻辑日志,记录一个变化过程。例如:
- 执行一个 delete,Undo log 会记录一个 insert;
- 执行一个 update,Undo log 会记录一个相反的 update。
在更新数据之前,MySQL 会提前生成 Undo Log 日志,在事务提交时不会立即删除 Undo Log,原因是之后可能还需要进行回滚操作,在执行回滚(ROLLBACK)操作时从缓存中读取数据。
Undo Log 日志的删除,是通过后台 purge 线程进行回收处理的。
来看一条 SQL 执行 update、select 的详细过程:
- 事务 A:执行更新操作,先将更新命中的数据备份到对应的 undo buffer,再由 undo buffer 持久化到磁盘中的 undo log 文件。
- 事务 B:进行查询操作,从 undo buffer 缓存中直接读取,若回滚(rollback)事务,先从 undo buffer 缓存直接读取,不需要读磁盘。
……
详解篇:
图解 MySQL Undo log 的存储机制及工作原理,3分钟精通!(Undo log上)
6 张图吃透 Undo log,MySQL进阶必知必会!(Undo log下)
8. Redo log 的结构、原理、写入步骤、刷盘机制等
Redo Log 是保证数据库持久性与一致性的关键。Redo log 的作用是保持事务的持久性、提高事务的提交效率。
Redo log 以循环写入的方式记录数据库的修改操作,采用固定大小的物理日志文件进行存储。
Redo log 记录了数据库页的物理修改,而非语句级别的逻辑操作。
Redo log 的结构
Redo log 的工作原理:
Redo log 的写入步骤:
log buffer 写入到 log file 分为两步:
- 写入操作系统缓存;
- 进行 fsync 操作刷新到磁盘。
Redo log 的刷盘机制:
通常建议取值 2,因为 MySQL 挂了,数据没有损失,整个服务器挂了,才会损失 1 秒的事务提交数据。
…….
……
详解篇:3分钟搞懂Redo log,MySQL持久性及一致性稳了
总结
[…] MySQL Binlog从基础到精通,24张图全面总结 、及 MySQL 事务从基础到精通,50+张图彻底吃透,宝子们的反馈还不错,宝妹儿已将内容更新到《MySQL […]