我试图弄清楚如何使用锁将项目插入B +树,并且不太了解它背后的理论。
因此,对于搜索,我的观点是我对根节点进行了锁定,然后决定我应该去哪个子节点并将其锁定,此时我可以释放父节点并继续此操作直到我到达叶节点。
但是插入要复杂得多,因为我不允许任何其他线程干扰插入。我的想法是沿着叶子节点的路径上的每个节点锁定,但是放置那么多锁是非常昂贵的,然后问题是当叶子节点因为它太大而分裂时会发生什么?
有没有人知道如何使用锁将项正确插入B +树?
答案 0 :(得分:2)
一般来说,处理B树的锁定有很多不同的策略;其中大部分实际上都是处理B +树及其变种,因为它们已经在这个领域占据了数十年的主导地位。总结这些战略将等于总结四十年的进展;这几乎是不可能的。以下是一些亮点。
在初始下降期间最小化锁定量的一种策略是不是从根开始锁定整个路径,而是仅锁定从最后一个稳定的开始的子路径。节点(即由于当前计划的操作而无法拆分或合并的节点)。
另一个策略是假设不会发生拆分或合并,这在大多数情况下都是正确的。这意味着可以通过仅锁定当前节点来完成下降,并且子节点将下降到下一个节点,然后释放对先前“当前”节点的锁定。节点等。如果结果是需要拆分或合并,那么在较重的锁定机制下(即根据最后一个稳定节点生成的路径)从根重新下降。
技巧包中的另一个主要内容是确保每个节点都通过'通过预防性分裂/合并是稳定的;也就是说,当当前节点在从下面冒泡的变化下分裂或合并时,它会在继续下降之前立即分裂/合并。这可以简化操作(包括锁定),并且它在轮子的重新设计中有点受欢迎 - 家庭作业和我也是如此'实施,而不是复杂的生产级系统。
某些策略允许在没有任何锁定的情况下执行大多数正常操作,但通常它们需要稍微修改标准B + Tree结构;例如,请参阅B-link trees。这意味着在树上运行的不同并发线程可以看到'此树的不同实体视图 - 取决于它们何时到达哪个链接并遵循哪个链接 - 但它们都看到相同的逻辑视图。
精彩论文和良好概述: