1. 背景
MyTopling 是拓扑岭(topling.cn)开发的 MySQL 兼容数据库,之前我们发布了文章 MyTopling:兼容 MySQL 的云原生数据库。
对于任何数据库来讲,事务处理都是核心中的核心,MyTopling 也一样。作为一个社会化分工协作的超大型项目:
- MyTopling fork 自 facebook 的 myrocks-8.0.23,对其中的关键模块进行全新设计
- facebook 的 myrocks-8.0.23 fork 自 oracle 的官方 mysql-8.0.23
- 在 MySQL 的存储引擎架构中,加入了 rocksdb 存储引擎
- rocksdb 存储引擎有两层含义
- 在 mysql 中,指的是一个名称为 rocksdb 的,实现了 mysql 存储引擎接口的插件
- 在更广泛的世界中,指的是 rocksdb 这个 Key Value 数据库
- facebook 的 myrocks-8.0.23 还基于 myrocks-5.6.35,本质上是 myrocks-5.6.35 与 oracle 的官方 mysql-8.0.23 两个项目合并的结果
2. MyRocks 的事务处理
MyRocks 的事务处理是使用 rocksdb 这个 KV 数据库中的 TransactionDB 来实现的,TransactionDB 属于 RocksDB 这个项目,而不属于 MyRocks,然而,事实上,因为 MyRocks 和 RocksDB 都是 facebook 开发的,TransactionDB 本质上是为 MyRocks 量身定做的,但是为了实现“复用”,TransactionDB 相当于是强行从 MyRocks 中抽取出来,然后“通用化”成 RocksDB 的一部分,从而可以为 MyRocks 之外的其它项目所用。
在 MyRocks 中,默认的 TransactionDB 是 PessimisticTransactionDB,顾名思义,就是“悲观”事务处理,即先检查是否有冲突,无冲突就继续,有冲突就失败。关于 RocksDB Transaction 的详细分析,知乎上有朋友写了非常棒的回答: