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插入后,也不能看见前面的版本,也就不能相连,不如时间旅行会回到从前。