回答
MVCC(Multi-Version Concurrency Control)即多版本并发控制。它允许在不加锁的情况下进行读取从而减少读写操作间的冲突。MVCC 是提高 MySQL 数据库并发性能的一个重要设计。
通常,同一行数据在读写请求时,会通过加锁保证数据的一致性;而 MVCC 在遇到读写冲突时,让其读数据时通过快照读而不是当前读,快照读不需要加锁。
MVCC 实现机制
在 InnoDB 的内部结构中,每行记录除了自定义的字段外,InnoDB 还会隐式地为每一行添加三个字段:
- DB_TRX_ID,事务 ID,长度为6个字节。记录最近修改该行的事务 ID。
- DB_ROLL_PTR,回滚指针,长度为7个字节。回滚指针指向回滚段的回滚日志(undo log),用于回滚操作或者构建旧版本记录。
- DB_ROW_ID,行 ID,长度为6个字节。它随着新行的插入而单调递增。如果一个表没有主键,InnoDB 会基于这个字段来创建聚簇索引。
InnoDB 中每行数据存在多个版本,每次事务更新数据时,会在 undo log 中记录变更前数据原始值。如下为行id = 1
的回滚链。
当前最新版本为V4,它是由 transaction id 为 1745 的事务更新的,故 V4 的 db_trx_id 为 1745。如果要得到该行 V2 版本的数据,那么可通过 V4 依次执行 V3、V2的更新操作计算出来。