在了解MVCC之前,我们先来了解一下两个概念:当前读和快照读
当前读:
当前读就是要读取数据行的当前最新的状态,防止其他线程对数据行进行变更,在读取的时候会对数据行进行加锁,是加锁阻塞读
快照读:
快照读没有要求读到的数据一定要是最新的版本,不会对数据行进行加锁,是一种解决并发读写冲突的方式,是不加锁非阻塞读,拥有更好的并发性能。
我们平时一般的读取用到的都是快照读
什么是MVCC
mvcc就是决定快照读返回数据行的哪个版本的底层控制逻辑
MVCC的工作原理
mvcc 就是为数据行挑选一个合适的版本
每一行数据行都有是三个隐藏的字段:
1 操作该数据行的最新事务id
2 回滚指针,指向 undo 日志中的该数据行的上一个版本
3 隐藏的主键,如果数据行没有主键,会自动生成一个
这三个隐藏字段,其中有1和2是MVCC主要的参与者
配合undo log 以及 read view 共同完成mvcc的控制逻辑
什么是undo log
undo log 记录数据行的每一个历史版本,是一个链表的形式,一般主要用于事务的回滚
什么是read view
read view 是在读取数据行的时候,会将当前正在活跃的事务id 收集起来,从小到大排序
mvcc的控制逻辑
我们假设read view 中的最小值、最大值分别为a和b
数据行的当前事务id为x