KaiwuDB 事务流程

179 阅读3分钟

1.KaiwuDB 事务基本概念

KaiwuDB 是一个支持SQL及完整事务ACID的分布式数据库。目前支持两种隔离级别,分别是Serializable和ReadCommitted。对于KaiwuDB库集群,接收请求的节点会充当事务协调节点(Coordinator), 不同于传统的2PC,KaiwuDB 通过事务表来保证事务的原子性。KaiwuDB 在事务开始时,会在事务表中新增一条事务记录,初始状态为Pending,然后协调节点会将请求发送给参与节点进行处理,当所有的参与节点执行完毕后,协调节点会将该事务的状态置为Committed;若事务回滚,则把事务状态标记为Abort。这样做的优点是大大降低了事务提交和回滚的开销。

\

2.事务的并发控制(MVCC)

在传统的单机数据库中,通常会使用一个单调递增的逻辑ID作为事务ID,同时这个逻辑ID也起着MVCC实现中数据版本号的作用。KaiwuDB 使用HLC时间追溯事务发生的先后顺序,为了实现MVCC,KaiwuDB 同时使用HLC时间戳作为数据的版本号。KaiwuDB 底层存储是KV,因此利用KEY + timestamp即可实现MVCC。在实际的操作中,为了快速读取到最新的数据,会把HLC取反encode到KEY的尾部,读取的时候以KEY作为前缀启动一个迭代器,这样最新的数据最先被读取到。

而对于事务中未提交的数据比较特殊,并不会把事务时间戳encode到KEY的尾部,而是把事务相关的信息和数据一起Encode到Value中,称之为WRITE INTENT。读取的时候,未提交的数据肯定最先被Get到。

\

对于已提交的数据,KaiwuDB 把HLC时间戳Encode到Key的尾部作为版本号,降序存储。

3.锁(lock),锁存(latch),写入意图

在 KaiwuDB 中一种类似排它写锁的锁类型,也就是被称作write intent的锁,是通过raft来进行复制的。它们本质上与标准多版本并发控制(MVCC)值相同,但还包含指向存储在集群上的事务记录的指针。

而另一种锁,latch锁和普通的事务锁还是有很大不同的,latch锁是代码维度为了锁住某个会被并发访问的变量。而lock锁是针对于事务来说的,所以两者的粒度,概念都不能进行比较。

latch会对传入的batch request进行排序,当某个range被发生写请求的时候,该range的lease holder就会对请求进行序列化,把它放置在一些一致的顺序中。为了执行此序列化,lease holder为写入值中的key创建了一个latch锁,从而提供了对key的无竞争访问。如果对同一个key的其他batch request进入lease holder,则它们必须等待释放latch锁后才能继续。