面试题学习笔记 | MySQL 事务基础:事务的实现与日志管理
1. MySQL 如何实现事务?
MySQL 通过以下机制共同实现事务,确保事务的 ACID 特性(原子性、一致性、隔离性和持久性):
锁机制(如行锁、间隙锁等):控制并发修改,满足事务的隔离性
Redo Log(重做日志):记录事务修改数据的操作,用于在 MySQL 宕机后恢复数据,确保事务的持久性
Undo Log(回滚日志):记录事务操作的反向操作,用于回滚事务,保障原子性和隔离性
MVCC(多版本并发控制):支持非锁定读取,提高并发性,实现隔离性
这些机制确保了事务的 AID 特性,而一致性是最终目标
2. MySQL 日志类型
MySQL 使用以下三种日志类型来保证事务的可靠性和恢复能力:
Binlog(二进制日志):
记录所有 DDL 和 DML 操作,包括表结构变更、数据插入、更新和删除
事务提交后生成,常用于数据备份、恢复以及主从复制
Redo Log(重做日志):
记录事务对数据的修改操作。事务提交时,先将修改写入 redo log 缓冲区,再持久化到磁盘
系统崩溃时,通过 replay redo log 来恢复数据,确保事务的持久性
Undo Log(回滚日志):
记录事务修改的反向操作,用于回滚事务
保障事务的原子性和隔离性
3. 扩展:Log Buffer
Log Buffer:在 InnoDB 中,日志数据先写入 Log Buffer,再批量写入 redo log 文件。这样能减少频繁的磁盘写入和上下文切换开销。默认情况下,事务提交时将 log buffer 刷写到磁盘,确保数据的持久性
4. MySQL 中的 MVCC
MVCC(多版本并发控制)提高了并发性能,允许事务同时读取和写入数据库而无需等待。它的核心思想是为每个事务创建数据快照,避免了锁机制的竞争
数据修改时不会立即覆盖原有数据,而是生成新的版本。每个版本都保留事务ID和时间戳
通过版本链和 undo log,可以无锁读取数据,提供高并发性能
MVCC 工作原理:
每个数据记录有多个版本。使用事务ID和 rollback pointer 来找到和恢复历史版本
数据版本的可见性依赖于事务启动时间和事务ID
readView:MVCC 中判断数据版本可见性的重要机制。它基于以下原则:
如果数据版本的
trx_id == creator_trx_id
,表示当前事务修改了数据,版本可见如果
trx_id < min_trx_id
,表示修改数据的事务已提交,版本可见如果
trx_id
在[min_trx_id, max_trx_id]
之间,则判断事务是否提交。若未提交,不可见,已提交可见
隔离级别:
读已提交:每次查询都会生成新的
readView
可重复读:同一个事务的所有查询共用一个
readView
5. 总结
ACID 特性:MySQL 通过锁机制、Redo Log、Undo Log 和 MVCC 实现了事务的原子性、隔离性和持久性
日志机制:通过 binlog、redo log 和 undo log,MySQL 实现了事务的恢复能力,并保障数据的安全性
MVCC:通过多版本并发控制,MySQL 提高了事务并发性,减少了锁竞争