MVCC
我们在内存中,经常会使用互斥锁的方式,来处理共享资源
并原则上,会最小粒度的只锁共享资源的算术运算。因此非常快
对于数据库则不太一样,数据库操作可能伴随磁盘 IO
要保持一定的读写效率,又能兼顾事务的 ACID 四要素中的 I (隔离性),常见的解决方案就是 MVCC 机制
MVCC 的核心想法就是:并发读写时,都基于当前数据的快照,写时不修改当前快照;又通过技巧,新写数据与旧快照数据重新构建出一个新版本。这样就可以互不干扰
关于 MVCC 的经典案例,笔者认为 Linux 的写时拷贝(Copy-on-write ,简称 COW)就是一个非常好的参考
BoltDB 与 MVCC
BoltDB 的 MVCC 实现是并发多读单写,即:
BoltDB 的 MVCC 实现细节
BoltDB 的数据组织方式是按 page 页为单位(结点)组成的 B+ 树(后面会介绍)
- BoltDB 每个事务开始会拷贝一份当前的 meta 到 tx 对象上
- meta 数据中有 root ,B+ 树的跟结点。因此就得到当前 B+ 树的快照
- 只读事务,只要读当前这颗树
- 读写事务,从要写的 page 页,到根结点,依次分配新页,并与其他快照旧页组成一个新 B+ 树。于是多出一个并发的版本出来
MVCC 与 freelist 的关系
写事务可能会删 page 页。但是该页可能被多个读事务引用着
这个就是在 freelist 中实现提供
|