【数据库】MVCC

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值