MVCC就是为了实现读-写冲突不加锁,而这个读指的就是快照读, 而非当前读,当前读实际上是一种加锁的操作,是灰心锁的实现
- 当前读:像select lock in share mode(共享锁), select for update ; update, insert ,delete(排他锁)这些操作都是一种当前读,为什么叫当前读?就是它读取的是记录的最新版本,读取时还要包管其他并发事务不能修改当前记录,会对读取的记录进行加锁。
- 快照读:像不加锁的select操作就是快照读,即不加锁的非壅闭读;快照读的条件是隔离级别不是串行级别,串行级别下的快照读会退化成当前读;之所以出现快照读的情况,是基于进步并发性能的考虑,快照读的实现是基于多版本并发控制,即MVCC,可以认为MVCC是行锁的一个变种,但它在很多情况下,避免了加锁操作,降低了开销;既然是基于多版本,即快照读大概读到的并不一定是数据的最新版本,而有大概是之前的历史版本
每行记录除了我们自定义的字段外,另有数据库隐式定义的DB_TRX_ID,DB_ROLL_PTR,DB_ROW_ID等字段① MVCC 核心机制
- DB_TRX_ID:6byte,最近修改(修改/插入)事务ID:记录创建这条记录/最后一次修改该记录的事务ID ---------【事务ID】
- DB_ROLL_PTR:7byte,回滚指针,指向这条记录的上一个版本(存储于rollback segment里) -----------------【回滚指针】
- DB_ROW_ID:6byte,隐含的自增ID(隐蔽主键),如果数据表没有主键,InnoDB会自动以DB_ROW_ID产生一个聚簇索引 ----------【隐蔽主键】
- 实际另有一个删除flag隐蔽字段, 既记录被更新或删除并不代表真的删除,而是删除flag变了 --------【删除标记】
欢迎光临 IT评测·应用市场-qidao123.com (https://dis.qidao123.com/) | Powered by Discuz! X3.4 |