Database 眨眼树如何应对这种情况?

Database 眨眼树如何应对这种情况?,database,blink,Database,Blink,在闪烁树中进行插入时,它将存储从根节点到叶节点的路径。当子节点拆分时,它会将这些更改传播到父节点。假设当传播研究线程A中的根节点时,当前插入检查堆栈(用于存储路径),并发现堆栈上的底部节点是“根”。“根”也需要分裂。它将创建一个新的根 那么,如果“根”已经被另一个线程分割,而“根”现在不是真正的根,该怎么办呢。因此,由线程A创建新根目录是不正确的 Blink tree如何应对这种情况?我不确定作者打算如何处理这个问题(我确实认为这是真的)。一种可能是添加一个包含树高(深度)和第一个块的地址的头块

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

那么,如果“根”已经被另一个线程分割,而“根”现在不是真正的根,该怎么办呢。因此,由线程A创建新根目录是不正确的


Blink tree如何应对这种情况?

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

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

什么是闪烁树?@OliCharlesworth,请参阅什么是闪烁树?@OliCharlesworth,请参阅