MySQL的MVCC总结
MySQL的MVCC(Multi-Version Concurrency Control)是一种并发控制机制,用于提供读已提交(READ COMMITTED)和可重复读(REPEATABLE READ)的隔离级别,以解决脏读、不可重复读和幻读等问题。
MVCC通过保存数据在某个时间点的快照来实现这一点,从而使得只读事务不会阻塞数据表的写事务,提高了系统的并发性能。
在MySQL InnoDB引擎中,MVCC的实现主要通过以下机制:
在每行数据中增加两个隐藏的列来实现:
- 一个列存储行的创建版本号(创建时间)
- 一个列存储行的删除版本号(删除时间)
- 保存了一个系统版本号,每开始一个新的事务,系统版本号会自增
读取数据时,根据以下规则:
- SELECT操作:只读取创建版本号小于或等于当前系统版本号的数据行,即只读取已提交的数据
- INSERT操作:将新插入行的创建版本号设置为当前系统版本号
- DELETE操作:不会立即删除行,而是将删除行的版本号设置为当前系统版本号
- UPDATE操作:不是更新原始数据行,而是插入一个新的数据行,并将旧数据行的删除版本号设置为当前系统版本号
以下是一个简化的示例,说明MVCC如何工作:
| 数据行 | 创建版本号 | 删除版本号 |
|--------|-------------|-------------|
| 1 | 1 | 未设置 |
| 2 | 2 | 未设置 |
假设系统版本号从1开始:
- 事务A开始,读取数据,只能看到创建版本号小于或等于1的数据行(即行1)
- 事务B开始,插入一个新行,设置其创建版本号为2
- 事务C开始,读取数据,可以看到创建版本号小于或等于2的数据行(行1和行2)
- 事务B提交,行3的创建版本号设置为2,而删除版本号未设置
- 事务A提交,行1的删除版本号设置为1
在这个例子中,MVCC确保了即使在并发事务中,每个事务也只能看到一致的数据视图。
评论已关闭