MVCC核心概念
1.读写互相不阻塞对方
2.读事务可以读一致性快照
3.支持时间旅行,也就是读过去的快照
但是存在写倾斜的问题。Write Skew Anomaly.

所以就MVCC到达不了serizable
MVCC实现

MVCC + time order
就靠原子操作CAS来check是否有人在写入,同时如果txnid大于read-ts的话,就要创建一个新的版本
MVCC + 2PL

同时事务Txn-id在到达上限后,会从1开始,那么我们就会发现没有可见的版本,为了解决这个,加了个frozen bit.Any new txn id will always be newer than a frozen version.
Version Storage
Append-Only
存在相同的table上的空位置插入

time-travel table
实际上差不多,就是插入在单独的time-travel表上,有两种选择,一种从老到新,一种从新到老,第一种的话,查询有点慢,第二种索引要发生变化。
delta
就是只存变化量,节省了内存。
GC
因为版本不能无限的增加,内存就爆了,所以要gc
Tuple level
提到了两种选择,第二种可能存在灰尘角落

Transaction Level

INDEX manager
如果要改变主键的话,先删除后插入
对于secondry index的话,我们有两种选择,第二种在pkey内存比较大的时候比较号。

同时MVCC下要支持重复的主键,因为A1,后面插入的A1,对A1来说不可见,同时A1插入后,也不能看见前面的版本,也就不能相连,不如时间旅行会回到从前。










![[牛客101] 二叉树的层序遍历](https://img-blog.csdnimg.cn/4f0d827a9c9548f0a9258e2e17487842.png)







