首先需要知道什么是 MVCC?
MVCC 多版本并发控制。MVCC就是通过数据行的多个版本管理来实现数据库的并发控制。这项技术是的InnoDB的事务隔离级别下执行一致性读 有了保证。换言之,就是为了查询一些正在被一个事务更新的行。并且可以看到他们被更新之前的值。查询在做查询的时候就不用等待 另一个事务释放锁。
MVCC在MySQL InnoDB中的实现主要是为了提高数据库并发性能,用更好的方式就是 读-写 冲突,做到即使有多写冲突时。也能做到 不加锁,非阻塞并发读,而这个读指的就是 快照读,当前读实际时一种加锁的操作,是悲观锁的实现。而MVCC本质是采用悲观锁思想的一种方式。
对应InnoDB来说,聚簇索引中的每个记录都包含了两个必要的隐藏字段:
trx_id:每次一个事务对某条聚簇索引记录进行改动时,都会把该事务的事务id赋值给trx_id隐藏列。
roll_pointer:回滚指针,每次修改数据时,都会把旧数据放入undo log日志中,新的数据指向该旧数据,做成一个版本链,该指针字段就称为回滚指针,通过该指针可以找到修改前的数据。
四、Read View
有了undo log就可以读取到记录的历史版本,那么在什么情况下,读取哪个版本的记录呢?这就用到了Read View,它帮我们解决了行的可见性问题。
Read View就是当某个事务在使用MVVC机制进行快照读操作时产生的读视图。该视图是数据库当前所有活跃事务id(还未提交的事务)组成的列表的一个快照。