BoltDB-MVCC的一种极简实践

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 1.前言 BoltDB是一个纯Golang实现的极简的key/value数据库。 传送门:boltdb/bolt 主库从2018年起就不再更新了。但它有2个衍生版本 hashicorp/raft-boltdb和etcd-io/bbolt分别被使用在Consul和Etcd。另外其它使用BoltDB的项目 BoltDB之所以能够得到广泛的应用,最大原因是它足够轻量,核心代码只有4000多行,另外大多数关系数据库(SQLite 除外)都需要在应用程序之外独立运行服务。比如MySQL你需要启动MySQL Server,这样就增加了额外的维护成本。而BoltDB可以嵌入在应用程序之中,同生同死。 本文萌叔会把重点放在BoltDB的事务机制的实现上 2. 事务并发控制关系 在BoltDB中官方的描述是有2中类型的事务,读写事务和读事务 2.1 读写事务包含 Bucket.Put()和Bucket.Delete() 等操作 func (b *Bucket) Put(key []byte, value []byte) error func (b *Bucket) Delete(key []byte) error 2.2 读事务包含 Bucket.Get() 等操作 func (b *Bucket) Get(key []byte) []byte 注意: 读写事务在后面的文章中简写为写事务 2.3 写事务并发控制 2.3.1 同一个进程内部的多个协程 通过读写锁来保证某一时刻只能有一个写事务运行。 模式 可以并发 备注 读-读 是 可以并发 读-写 是 1个写事务和多个读事务可以并发 写-写 否 互斥 type DB struct { ... rwlock sync.Mutex // Allows only one writer at a time. ... } 2.3.2 同一台设备上的多个进程 使用操作系统的文件读写锁控制并发 ...

March 2, 2022 · 3 min