https://blog.youkuaiyun.com/SnailMann/article/details/88388829?spm=1001.2014.3001.5501
https://blog.youkuaiyun.com/SnailMann/article/details/94724197?spm=1001.2014.3001.5501
举例子:
当前事务id为2
当前活跃事务有事务1,3
事务4在事务2快照前更新
此时Read View记录 活跃事务1,3id ,还记录最小id1,最大id为5(事务4+1=5)
我们当前事务2在快照该行记录, 会拿 当前事务id=2 和 读视图readview中 1,3,5做比较. , 并非小于1,并非大于5, 也不是活跃的1,3 ,符合可见性; 从undo里看到的上一个事务4对事务2快读时是可见的;;;那么事务2能读到事务4交的版本, 说明事务4是全局角度的最新版本
总结:MVCC,做到即使有读写冲突时,也能做到不加锁,非阻塞并发读
在当前事务快照读时: 通过 当前事务id 和 读视图中记录的事务id(最小/大事务id,当前活跃事务)比较, 如果小于最小,大于最大则不合理,不可见, 如果是活跃事务,也不可见… 都不是的话,就可见,说明是 在undo里上一个版本的.
总的来说:通过 快照读,读视图,undo, 很容易找到上一个版本, 多个版本并发的读-写,也就有序,不冲突了. 即mvcc通过多版本解决了事务并发问题.