BoltDB 介绍与源代码分析(八):MVCC 多版本并发控制

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 中实现提供

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

fananchong2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值