MVCC的目的就是:多版本并发控制,在数据库中的实现,就是为了解决读写冲突
它的实现原理主要是:依赖记录中的 3个隐式字段,undo日志 ,Read View 来实现的。
所以,我们先来看看这个三个point的概念。
1 隐式字段
每行记录除了我们自定义的字段外,还有数据库隐式定义的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(隐藏主键),如果数据表没有主键,Inno DB会自动以DB_ROW_ID产生一个聚簇索引
实际还有一个删除flag隐藏字段, 既记录被更新或删除并不代表真的删除,而是删除flag变了
如上图,
DB_ROW_ID是数据库默认为该行记录生成的唯一隐式主键;
DB_TRX_ID是当前操作该记录的事务ID;
DB_ROLL_PTR是一个回滚指针,用于配合undo日志,指向上一个旧版本;