一. 概述
- MySQL 的 MVCC(Multi-Version Concurrency Control,多版本并发控制)是一种用来管理数据库读操作和写操作之间冲突的技术,它允许数据库系统在读操作不加锁的情况下,并发地执行写操作。MVCC 主要用于支持高并发的数据库事务处理,特别是在 InnoDB 存储引擎中得到了广泛应用。
二. MVCC 的主要特点
- 非锁定读:MVCC 允许事务在读取数据时不需要加锁,因此可以显著提高并发性能。
- 一致性读:在事务开始时,MVCC 会为该事务创建一个一致性视图(read view),确保该事务只能看到该时间点之前已经提交的数据版本。
- 版本控制:MVCC 通过为每个数据行维护多个版本(通过隐藏列和回滚段实现)来实现。每个事务只能看到符合其一致性视图的数据版本。
三. MVCC 的实现机制
3.1. 隐藏列
- 在 InnoDB 存储引擎中,每行数据都包含三个隐藏列:
DB_TRX_ID:记录最后修改该行数据的事务ID。
DB_ROLL_PTR:回滚指针,指向该行的undo log记录。
DB_ROW_ID:如果没有设置主键,InnoDB会自动生成一个唯一的行ID。
3.2. Undo Log
- Undo Log 用于存储数据的旧版本(历史记录),以便在事务回滚时或者为其他事务提供旧版本数据时能够恢复数据。
3.3. Read View
- 当事务开始时,InnoDB 会为该事务创建一个 Read View,该 Read View 记录了当前系统中活跃(未提交)的事务ID列表。通过这个列表,事务可以决定哪些版本的数据对其可见。
四. MVCC 的读操作
- 一致性非锁定读:默认的事务隔离级别(REPEATABLE READ)下,SELECT 语句会采用一致性非锁定读,即只读取在当前事务开始前已经提交的数据版本。
- 快照读:与一致性非锁定读类似,都是基于 Read View 来读取数据的。
五. MVCC 的写操作
- 当前读:通过 SELECT … FOR UPDATE 或 SELECT … LOCK IN SHARE MODE 实现的读操作,会锁定读取的数据行,并读取最新的数据版本。
- 更新/删除操作:在修改数据时,InnoDB 会将旧版本的数据复制到 undo log 中,并修改数据行中的 DB_TRX_ID 和 DB_ROLL_PTR,以指向新的版本。
六.总结
MVCC 通过版本控制和 Read View 机制,实现了在不加锁的情况下并发读取数据,同时保证了事务的隔离性和一致性。这是 InnoDB 存储引擎能够支持高并发事务处理的关键技术之一。