繁体   English   中英

使用锁插入B +树

[英]Inserting into B+ tree using locks

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

因此,对于搜索,我的看法是,我在根节点上放了一个锁,然后决定应该去哪个子节点并对其进行锁定,这时我可以释放父节点并继续执行此操作,直到到达叶节点为止。

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

有人知道如何使用锁将项目正确插入B +树吗?

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

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

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

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

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

开创性论文和良好概述:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM