concurrency - MVCC & B-Tree & 并发

标签 concurrency b-tree mvcc

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

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

最佳答案

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

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

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

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

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

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

关于concurrency - MVCC & B-Tree & 并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38677780/

相关文章:

Java:SingleThreadScheduledExecutor & java.util.concurrent.RejectedExecutionException

java - CopyOnWriteArrayList 是否足以在 Servlet Session 范围内保持购物车线程安全

algorithm - B-树插入 : during the descend in the tree, 为什么我们用 2t-1 个元素拆分每个节点?

mysql - 更新后从另一个事务可见,是MySQL MVCC的bug吗?

database - 你会在预写日志中记录什么?

ProcessBuilder 调用的 Java 进程永远 hibernate

data-structures - B-Tree 键的值存储在哪里?

algorithm - 除了对完整性的要求外,B-tree 和 B*-tree 之间有什么区别?

postgresql - 如何显示 PostgreSQL 中某行的旧版本?

java - 在方法中使用 'var' 是否会使执行(并发)线程不安全?