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删除
在每一个版本后面增加一个标志,标志其是删除的;
插入一个墓碑,墓碑前面的版本都是删除的。