Blink-tree如何应对这种情况?

时间:2013-04-01 23:15:30

标签: database blink

在Blink树中进行插入时,它将存储从根节点到叶节点的路径。当子节点拆分时,它会将这些更改传播到父节点。假设当传播研究线程A中的根节点,并且当前插入检查堆栈(用于存储路径)并发现堆栈上的底部节点是“根”。而“根”也需要分裂。它将创建一个新的根。

那么,如果“root”已被另一个线程拆分并且“root”现在不是真正的root,该怎么办呢?因此,创建由线程A完成的新根是不正确的。

Blink-tree如何应对这种情况?

1 个答案:

答案 0 :(得分:1)

我不确定作者是如何处理这个问题的(我确实认为这是真的)。一种可能性是添加包含树高(深度)的标题块和叶子上方每个高度的第一个块的地址。如果你曾经跑过堆栈的末尾,你需要锁定这个块并读取它以确定一个新的根(或者更准确地说,是在堆栈中树高以上的第一个块)。如果存在,请解锁标题块并将块添加到堆栈中,然后再继续。如果新根不存在,您可以创建它并将其添加到头块之后再写入索引块(在写入新根之后)。理论上,如果根在上下阶段之间多次分裂,则可能会发生多次。通过在检查之前和添加新根之前锁定标头块,我认为您可以维护排序不变量以避免死锁。