Multi-version Concurrency Control
DBMS 维护一个对象的多版本在数据库中。所以事务可以访问历史版本信息。
只依赖MVCC做不到可串行化;
一个事务在改对象的时候,留下一个历史版本,其他的事务可以读这个历史版本的数据。
读者不锁写着;
 写者不锁读者;
只读的事务可以一直读一个一致的快照,在无锁的情况下。
 Read-only txns can read a consistent snapshot without acquiring locks.
利用时间戳来作为一个版本号。
 
 MVCC并发控制
 #1 Timestamp Ordering 结合
 #2 Optimistic concurrency control 结合
 #3 Two-phase locking 结合
MVCC存储方法
 #1 Append-only storage
 把新的版本放在末尾;
 把旧的版本放在末尾;
#2 Time-travel storage
 创建一个历史表,来记录历史的版本。
 
 #3 Delta Storage
 历史表只存储变化的值。是一种时间换空间的方法。
 
MVCC垃圾回收
 DBMS needs to remove reclaimable physical versions from the database over time:
 No active txn in the DBMS can see that version;
 The version was created by an aborted txn;
#1 以行记录为基础的回收
 Background Vacuuuming:
 后台的线程按时间线扫描所有记录
 
 合作的垃圾清理:不需要一个专门的后台线程来进行垃圾回收,而是每个线程在访问的时候,顺手进行垃圾清理。
 
 #2 以事务为基础的回收
 事务记录自己的更改的版本。
 
MVCC下的索引管理
辅助索引:
 #1 logical pointer
 需要二次访问;
#2 Physical pointer
 
 如果插入的话,那么所有辅助索引的指向地址值都要更改。
MVCC 的索引就可能指向多个版本信息;
 
 从一个索引可以找到多个的历史版本,然后找到自己所需要的那一个版本信息。同时,为了保证索引的唯一性,需要额外的逻辑来辅助。
MVCC删除的时候,也要保证所有的版本都没有用了。才可以删除。
 MVCC删除
 在每一个版本后面增加一个标志,标志其是删除的;
 插入一个墓碑,墓碑前面的版本都是删除的。
 
 



















