![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
MySQL核心模块揭秘
文章平均质量分 93
爱可生开源社区
成立于 2017 年,以开源高质量的运维工具、日常分享技术干货内容、持续的全国性的社区活动为社区己任;目前开源的产品有:SQL审核工具 SQLE,分布式中间件 DBLE、数据传输组件DTLE。
展开
-
MySQL 核心模块揭秘 | 17 期 | InnoDB 有哪几种行锁?
InnoDB 有哪几种行锁,其中比较特殊的插入意向锁为什么而存在?原创 2024-05-22 15:42:16 · 297 阅读 · 0 评论 -
MySQL 核心模块揭秘 | 16 期 | InnoDB 表锁
server 层。存储引擎。基于以上两层结构,MySQL 的锁也可以分为两大类。server 层的锁,就是让我们头痛不已的元数据锁(MDL)。存储引擎的锁,取决于各存储引擎的实现。InnoDB 支持表锁、行锁、谓词锁(用于空间索引,我们不会介绍)。表锁分为共享锁(S)、排他锁(X)、意向共享锁(IS)、意向排他锁(IX)、AUTO-INC 锁。行锁分共享锁(S)、排他锁(X),以及有点特殊的插入意向锁(普通记录锁(LOCK_REC_NOT_GAP)。间隙锁(LOCK_GAP)。原创 2024-05-17 11:22:54 · 895 阅读 · 0 评论 -
MySQL 核心模块揭秘 | 15 期 | 事务模块小结
👆 事务执行过程中产生的 binlog 日志,写入 binlog 日志文件之前,需要有个临时存放的地方。👆 事务有不同的身份,比如读事务、只读事务、读写事务。这篇文章介绍了读事务、只读事务的身份什么时候会发生变化,以及会发生什么样的变化。👆 这篇文章介绍了开启一个事务的各种 SQL 语句,并且以 BEGIN 为代表,介绍了开始一个事务的过程。👆 事务池和管理器是事务模块的基石,把它们的初始化过程作为专栏的第一篇文章,再合适不过了。👆 回滚整个事务,属于我们经常用到的功能,这篇文章介绍了回滚整个事务的过程。原创 2024-04-24 14:15:43 · 452 阅读 · 0 评论 -
MySQL 核心模块揭秘 | 13 期 | 回滚到 savepoint
回滚整个事务,主要分为三大步骤。第 1 步,执行 binlog 回滚操作,其实什么也没干。第 2 步,执行 InnoDB 回滚操作,会把事务执行过程中改变(插入、更新、删除)的记录恢复原样(至少从逻辑上来看是这样的)。最后,还会提交 InnoDB 事务,让回滚操作对数据页的修改生效。第 3 步,清除事务执行过程中产生的、临时存放于 trx cache 中的 binlog 日志。本期问题:关于本期内容,如有问题,欢迎留言交流。原创 2024-04-18 15:50:41 · 1047 阅读 · 0 评论 -
MySQL 核心模块揭秘 | 11 期 | InnoDB 提交事务,提交了什么?
InnoDB 提交事务,就像我们填完一个表格之后,最后盖上的那个戳,总体上来说,要干 3 件事。第 1 件,修改分配给事务的各 undo 段的状态。如果数据库发生崩溃,重新启动后,undo 段的状态是影响事务提交还是回滚的因素之一。第 2 件,修改事务对象的状态。如果数据据库一直运行,不发生崩溃,就靠事务对象的状态来标识事务是否已提交。第 3 件,把各 undo 段中的 undo 日志组加入链表。其它事务都不再需要使用这些 undo 日志时,后台 purge 线程会清理这些 undo 日志组中的日志。原创 2024-03-28 09:55:29 · 419 阅读 · 0 评论 -
MySQL 核心模块揭秘 | 10 期 | binlog 怎么写入日志文件?
binlog 日志文件包含两部分:内存 buffer、磁盘文件。内存 buffer 的大小固定为 8K。二阶段提交的 flush 子阶段,会从 trx_cache 中读取 binlog 日志,写入 binlog 日志文件。本期问题:如果事务执行过程中产生的 binlog 日志直接写入 binlog 日志文件,会有什么问题吗?欢迎留言交流。下期预告:MySQL 核心模块揭秘 | 11 期 | InnoDB 提交事务,提交了什么?原创 2024-03-21 09:58:54 · 452 阅读 · 0 评论 -
MySQL 核心模块揭秘 | 08 期 | 二阶段提交 (2) commit 阶段
二阶段提交的 commit 阶段分为三个子阶段:flush 子阶段、sync 子阶段、commit 子阶段。flush 子阶段会把 prepare 阶段及之前产生的 redo 日志都刷盘,把事务执行过程中产生的 binlog 日志写入 binlog 日志文件。sync 子阶段会根据系统变量 sync_binlog 的值决定是否把 binlog 日志刷盘。为了避免每个事务各自提交,触发操作系统对同一个页频繁的重复刷盘,InnoDB 引入了组提交。原创 2024-03-06 13:18:39 · 1210 阅读 · 0 评论 -
MySQL 核心模块揭秘 | 07 期 | 二阶段提交 (1) prepare 阶段
开启 binlog 的情况下,用户事务需要使用二阶段提交来保证 binlog 和 InnoDB 表的数据一致性。binlog prepare 什么也不会干。InnoDB prepare 会把分配给事务的所有 undo 段的状态修改为 TRX_UNDO_PREPARED,把事务 Xid 写入 undo 日志组的头信息,把内存中事务对象的状态修改为 TRX_STATE_PREPARED。本期问题:二阶段提交的 prepare 阶段为什么不把 redo 日志刷盘?欢迎大家留言交流。下期预告。原创 2024-02-29 13:29:01 · 1056 阅读 · 0 评论 -
MySQL 核心模块揭秘 | 06 期 | 事务提交之前,binlog 写到哪里?
trx_cache 分为两级:内存(buffer)、临时文件。事务执行过程中,产生的所有 binlog event 都要写入 trx_cache。binlog event 写入 trx_cache,通常情况下,都会先写入 buffer,写满 buffer 之后,再把 buffer 中所有内容都写入临时文件,最后清空 buffer。本期问题:如果 buffer 是空的,接下来要写入一个 86K 的 binlog event 到 trx_cache,写入流程是什么样的?欢迎大家留言交流。下期预告。原创 2024-02-21 17:23:34 · 1038 阅读 · 0 评论 -
MySQL 核心模块揭秘 | 05 期 | 读事务和只读事务的变形记
如果执行的第一条 SQL 语句是 update 或 delete,在 SQL 语句执行过程中,读事务会变成读写事务,只读事务会分配事务 ID 和用户临时表的回滚段。如果执行的第一条 SQL 语句是 select,在后续第一次执行 insert、update、delete 三种语句的其中一种时,读事务会变成读写事务,只读事务会分配事务 ID 和用户临时表的回滚段。分配事务 ID。为用户普通表分配回滚段。把事务对象加入链表。本期问题:关于本期内容,如有问题,欢迎留言交流。下期预告。原创 2024-01-31 15:22:25 · 1032 阅读 · 0 评论 -
MySQL 核心模块揭秘 | 04 期 | 终于要启动事务了
InnoDB 开启内部事务,是为了改变表中数据,所以,内部事务都以读写事务的身份启动。执行的第一条 SQL 语句是 select、update、delete,以读事务身份启动事务。执行的第一条 SQL 语句是 insert,以读写事务身份启动事务。如果只读事务执行的第一条 SQL 语句是插入记录到用户临时表的 insert,也会分配事务 ID。本期问题:mysql_trx_list、rw_trx_list 这两个链表分别用来干什么?欢迎留言交流。下期预告。原创 2024-01-24 13:20:51 · 886 阅读 · 0 评论 -
MySQL 核心模块揭秘 | 01 期 | 事务的起源:事务池和管理器的初始化
InnoDB 只有一个事务池管理器,用于管理 N 个事务池(N >= 1),每个事务池可以管理 4228 个事务对象。MySQL 启动过程中,InnoDB 会先创建事务管理器。事务管理器会创建一个事务池,初始化 16 个事务对象放入事务池的事务队列。MySQL 运行过程中,如果这 16 个事务对象都正在被使用,InnoDB 需要一个新的事务对象时,会一次性初始化剩余的 4212 个事务对象并放入事务池的事务队列。本期问题:运行过程中,创建一个新的事务池,会分配多少内存?初始化多少个事务对象?原创 2024-01-04 14:56:36 · 954 阅读 · 0 评论 -
MySQL 核心模块揭秘 | 02 期 | MySQL 中 BEGIN 语句会马上启动事务吗?
一句话总结:BEGIN 语句执行过程中,要做的事情就是辞旧(提交老事务)迎新(准备新事务),并不会马上启动一个新事务。本期问题:对于 START TRANSACTION 同时指定 READ WRITE、READ ONLY,除了报错,你还有别的思路解决这个问题吗?欢迎大家留言交流。下期预告:我是一个事务,请给我一个对象。原创 2024-01-10 13:16:35 · 1190 阅读 · 0 评论 -
MySQL 核心模块揭秘 | 03 期 | 我是一个事务,请给我一个对象
先从事务池的事务队列中分配一个对象。如果事务队列中没有可用的事务对象,就初始化事务池的剩余小块内存,从得到的事务对象中分配一个对象。如果所有事务池都没有剩余未初始化的小块内存,就创建一个新的事务池,并从中分配一个事务对象。本期问题:InnoDB 怎么没有把内部事务也放入链表?欢迎大家留言交流。下期预告:准备那么久,终于要启动 InnoDB 事务了。原创 2024-01-17 14:12:51 · 903 阅读 · 0 评论 -
MySQL 核心模块揭秘 |《发刊词》
接下来的一年,我们一起 探索 InnoDB 事务、锁、Redo、Undo、MVCC 的底层原理,看看 MySQL 运行时都干了什么?原创 2023-12-28 10:00:50 · 627 阅读 · 0 评论