【问题标题】:Inserting into B+ tree using locks使用锁插入 B+ 树
【发布时间】:2016-03-02 08:37:23
【问题描述】:

我试图弄清楚如何使用锁将项目插入 B+ 树,但并不真正理解其背后的理论。

所以对于搜索,我的观点是我在根节点上加了一个锁,然后决定我应该去哪个子节点锁定它,此时我可以释放父节点并继续这个操作直到我到达叶节点。

但是插入要复杂得多,因为我不能让任何其他线程干扰插入。我的想法是在通往叶节点的路径上的每个节点上加一个锁,但是放置这么多锁非常昂贵,然后我的问题是当叶节点因为太大而分裂时会发生什么?

有谁知道如何使用锁正确地将一个项目插入到 B+ 树中?

【问题讨论】:

    标签: database multithreading b-tree


    【解决方案1】:

    通常有许多不同的策略来处理 B 树中的锁定;其中大多数实际上处理 B+Trees 及其变体,因为它们已经在该领域占据主导地位数十年。总结这些战略,就等于总结了四个十年的进步;这几乎是不可能的。以下是一些亮点。

    在初始下降过程中最小化锁定量的一种策略是不锁定从根开始的整个路径,而只锁定从最后一个“稳定”节点开始的子路径(即不会分裂或由于当前计划的操作而合并)。

    另一种策略是假设不会发生拆分或合并,这在大多数情况下都是正确的。这意味着可以通过仅锁定当前节点来完成下降,子节点将下降到下一个节点,然后释放对先前“当前”节点的锁定,依此类推。如果事实证明拆分或合并是必要的,那么在更重的锁定机制下从根重新下降(即路径植根于最后一个稳定节点)。

    技巧包中的另一个主要内容是通过预防性拆分/合并来确保每个“下降通过”的节点都是稳定的;也就是说,当当前节点在从下方冒泡的变化下拆分或合并时,它会在继续下降之前立即拆分/合并。这可以简化操作(包括锁定),并且在重新发明轮子(家庭作业和“我也是”实现)中有些流行,而不是复杂的生产级系统。

    一些策略允许执行大多数正常操作而根本没有任何锁定,但通常它们需要对标准的 B+Tree 结构稍作修改;例如,参见B-link trees。这意味着在树上运行的不同并发线程可以“看到”这棵树的不同物理视图 - 取决于它们何时到达何处并遵循哪个链接 - 但它们都看到相同的逻辑 查看。

    开创性论文和良好的概述:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-04-10
      • 2012-01-18
      • 2012-04-10
      • 2021-08-27
      • 2011-05-20
      • 2019-12-02
      • 2011-02-07
      相关资源
      最近更新 更多