【问题标题】:MVCC & B-Tree & ConcurrencyMVCC & B 树 & 并发
【发布时间】:2016-12-05 06:58:06
【问题描述】:

我目前正在阅读 dbms 书籍,据我了解,Mvcc(多版本并发控制)用于高并发读写事务。 但是“搜索结构的并发控制”一章提到了 B-Trees 的不同锁定概念(锁定耦合、链接技术等)。

Mvcc 不是应用于 dbms 中 B-Tree 的内部节点和叶节点吗? B-Tree并发和MVCC完全不同吗?如果是,Mvvc在dbms中是如何实现的?

【问题讨论】:

    标签: concurrency b-tree mvcc


    【解决方案1】:

    MVCC 可以通过多种方式实现。唯一的要求是可以使用某种较旧的行版本。

    例如,SQL Server 将它们存储在一个临时数据库中,该数据库会在服务器重新启动时重置。

    Postgres 将行版本作为隐藏行直接存储在 b 树中。它将隐藏的键列添加到树中。当从树中读取时,只公开逻辑上应该看到的版本。

    RavenDB 的 Voron 将 b-tree 页面作为不可变数据进行管理。写入会创建全新的树。因此,MVCC 被实现为从正确的不可变树中读取。

    数据库很少长时间锁定物理结构。让数据库客户端停止数据库内部结构的进展并不是一个好主意。内部结构通常被非常短暂地锁定。逻辑行锁分开处理。

    如果我不得不猜测concurrency control on search structures 指的是物理线程安全。这通常不涉及 MVCC,因为不需要管理多个版本。普通的内存锁足以应付短暂的访问。

    【讨论】:

      【解决方案2】:

      MVCC 意味着你不需要使用锁。

      假设每笔交易都有一个数字时间戳,每笔交易都会增加。在这个例子中,我们有交易 1 和 2。

      事务 1 读取 A 并写入值 (A + 1)。快照隔离创建事务 1 拥有的 (A) 的临时版本。 A的读取时间戳设置为事务1。

      如果事务 2 同时出现并读取 A,它也会读取已提交的 A——它不会看到 A + 1,因为它尚未提交。事务 2 可以看到 == lastCommittedA 和

      在事务2读取A的时候,它也会检查A的读取时间戳,看到有事务1,检查事务1时间戳

      (我已经在 J​​ava 中实现了 MVCC。参见 transactionrunnermvcc 代码我已经实现了 a btree in Python。)

      【讨论】:

        猜你喜欢
        • 2015-09-21
        • 2012-01-20
        • 1970-01-01
        • 2014-09-20
        • 1970-01-01
        • 1970-01-01
        • 2011-02-13
        • 2016-03-16
        • 2011-09-06
        相关资源
        最近更新 更多