简介
- Multi Version Concurrency Control (MVCC), 即多版本并发控制, 是基于锁的并发控制。(Lock-Based Concurrency Control)
- MVCC在Oracle, MySQL, PostgreSQL等主流RDBMS中都有应用, 在此仅解释MySQL中的MVCC。
- 特征优势: 读不加锁, 读写不冲突, 有利于提升读多写少的OLTP应用中系统的并发性能。
- 在理解MVCC前需要复习一下MySQL架构, 事务隔离级别 以及锁机制。
MySQL架构
事务隔离级别
ACID就不说了, 老生常谈。
Read Uncommitted
- 读未提交, 可以读取尚未提交的数据。
- 缺点: 会产生脏读, 幻读, 不可重复读。
Read Committed
- 读已提交(大多数数据库默认事务隔离级别, MySQL不是)
- 优点: 避免了脏读
- 缺点: 可能会造成不可重复读
Repeatable Read
- 可重复读(MySQL 默认事务隔离级别)
- 优点: 避免了不可重复读
- 缺点: 可能出现幻读
Serializable
序列化, 最高的事务隔离级别
优点: 避免了脏读, 幻读, 不可重复读
缺点: 代价高, 性能很低
很少使用
锁机制
- 读锁
- 也称共享锁, 若事务I对数据对象A加上读锁, 则事务T可以读A但不能修改A。
- 其他事务只能再对A加读锁, 而不能加写锁, 直到I释放A上的读锁。
- 它保证了其他事务可以读A, 但是在I释放A上的S锁之前不能对A做任何修改。
- 写锁
- 又称排他锁, 若事务I对数据对象加上写锁, 事务I可以读A也可以修改A。
- 其他事务不能再对A加任何锁, 直到I释放A上的锁。
- 这保证了其他事务在I释放A上的锁之前不能再读取和修改A。
- 表锁
- 操作对象是数据表。
- MySQL大多数锁策略都支持表锁,是系统开销最低但并发性最低的一个锁策略。
- 行级锁
- 操作对象是数据表中的一行。
- MVCC较多使用该锁。
- 对系统开销较大, 但处理高并发较好。
重要字段
- data_trx_id
- 用来标识最近一次对本行记录做修改(insert|update)的事务的标识符, 即最后一次修改(insert|update)本行记录的事务id。
- DB_TRX_ID记录了行的创建的时间,删除的时间在每个事件发生的时候,每行存储版本号,而不是存储事件实际发生的时间。
- 每次事务的开始此版本号都会增加。
- 自记录时间开始,每个事物都会保存记录的系统版本号。
- 依照事物的版本来检查每行的版本号。
- data_poll_ptr
- 指写入回滚段(rollback segment)的 undo log record (撤销日志记录记录)。如果一行记录被更新, 则 undo log record 包含 ‘重建该行记录被更新之前内容‘ 所必须的信息。

?
MVCC实现
- 基本原理
- MVCC通过在每行纪录后面保存两个隐藏的列来实现的。
- 一个保存了行的创建时间[实际存储的是版本号]
- 一个报存了行的过期时间(或删除时间)[实际存储的是版本号]
- 每开始一个新的事务, 系统版本号都会自动递增。
- 事务开始时刻的系统版本号会作为事务的版本号, 用来与查询到的每行记录的版本号进行比较。
- 在RR(Repeatable Read) 隔离级别下, MVCC具体操作如下:
- select
- InnoDB会根据以下两个条件检查每行记录:
- InnoDB只查找版本早于当前事务版本的数据行。这样可以确保事务读取的行,要么是在事务开始前已经存在的,要么是事务自身插入或者修改过的。
- 行的删除版本,要么未定义,要么大于当前事务版本号。这样可以确保事务读取到的行,在事务开始之前未被删除。
- insert
- InnoDB为插入的每一行保存当前系统版本号作为行版本号。
- delete
- InnoDB为删除的每一行保存当前系统版本号作为行删除标识。
- update
- InnoDB为插入一行新纪录,保存当前系统版本号作为行版本号。
- 同时,保存当前系统版本号到原来的行作为行删除标识。
- 优点
- 保存这两个额外系统版本号,使大多数读操作都可以不用加锁。
- 这样设计使得读数据操作很简单,性能很好。
- 缺点
- 每行纪录都需要额外的存储空间,需要做更多的行检查工作,以及一些额外的维护工作。
MySQL MVCC
原文:https://www.cnblogs.com/ronnieyuan/p/12203052.html