什么是MVCC?
MVCC:多版本并发控制,是一种并发控制的方法,一般是数据库管理系统中,实现数据的并发访问,mysql中的事务可以通过这种方式实现。
MVCC 在 MySQL InnoDB 中的实现主要是为了提高数据库并发性能,用更好的方式去处理读-写冲突,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读
MVCC定义的当前读、快照读
- MVCC 多版本并发控制是 ,维持一个数据的多个版本,使得读写操作没有冲突
- 因为 MVCC 只是一个抽象概念,要实现这么一个概念,MySQL 就需要提供具体的功能去实现它,「快照读就是 MySQL 实现 MVCC 理想模型的其中一个非阻塞读功能」。而相对而言,当前读就是悲观锁的具体功能实现
- 再深入研究。MVCC 模型在 MySQL 中的具体实现则是由
3 个隐式字段
,undo 日志
,Read View
等去完成的
MVCC可以解決的场景
MVCC可以解决读-写冲突的无锁并发控制,可以通过快照读来实现读-写冲突。
MVCC的实现原理
MVCC 的目的就是多版本并发控制,在数据库中的实现,就是为了解决读写冲突
,它的实现原理主要是依赖记录中的 3个隐式字段
,undo日志
,Read View
来实现的。所以我们先来看看这个三个 point 的概念
隐藏字段:
每行记录除了我们自定义的字段外,还有数据库隐式定的 DB_TRX_ID
, DB_ROLL_PTR
, DB_ROW_ID
等字段
- DB_TRX_ID
6 byte,最近修改(修改/插入
)事务 ID:记录创建这条记录/最后一次修改该记录的事务 ID
- DB_ROLL_PTR
7 byte,回滚指针,指向这条记录的上一个版本(存储于 rollback segment 里)
- DB_ROW_ID
6 byte,隐含的自增 ID(隐藏主键),如果数据表没有主键,InnoDB 会自动以DB_ROW_ID
产生一个聚簇索引
undo日志
- insert undo log
代表事务在 insert 新记录时产生的 undo log, 只在事务回滚时需要,并且在事务提交后可以被立即丢弃
- update undo log
事务在进行 update 或 delete 时产生的 undo log ; 不仅在事务回滚时需要,在快照读时也需要;所以不能随便删除,只有在快速读或事务回滚不涉及该日志时,对应的日志才会被 purge 线程统一清除