我正在实现一个嵌入式键值存储,并希望在其中支持Transactions。这是我目前一直在研究的模型:
Basic operations supported :
- put(K,V)
- get(K)
- delete(K)
Steps for a put(K,V) :
- Log the K,V into a WAL and flush it to disk.
- Write the actual data on disk. [I do have buffering implemented but
we can ignore it for this question].
我通读过的所有文献都谈到了在日志记录中保持以下状态(WAL(:TxId, OldValue, NewValue
,其中OldValue用于撤消,NewValue用于重做。
我的问题是如何获得每个密钥K的OldValue?如果我需要搜索我的键值存储,即每个put(K,V)
操作的get(K)
,那么这将是非常低效的,因为我将每次写入与通过存储搜索以前的值联系在一起(因为它可能不存在于内存缓存中(
它取决于okvs架构的其余部分。如果您使用日志/日志,并且不更新磁盘上的表示形式,并且不支持嵌套事务,则不需要存储旧值。如果您使用MVCC,则您已经具有旧值。