首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MVCC &B-树与并发

MVCC &B-树与并发
EN

Stack Overflow用户
提问于 2016-07-30 19:33:18
回答 2查看 1.1K关注 0票数 4

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

Mvcc不适用于数据库管理系统中B树的内部和叶节点吗?B树并发和MVCC完全不同吗?如果是的话,Mvvc是如何在dbms中实现的?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-07-30 20:40:27

MVCC可以通过多种方式实现。唯一的要求是,在某种程度上,旧行版本是可用的。

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

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

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

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

如果我不得不猜测,concurrency control on search structures指的是物理线程安全。这通常不涉及MVCC,因为不需要管理多个版本。内存中的普通锁对于短暂的访问来说已经足够了.

票数 3
EN

Stack Overflow用户

发布于 2021-06-22 18:08:18

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

假设每个事务都有一个数字时间戳,每个事务的时间戳都会上升。在这个例子中,我们有事务1和2。

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

如果事务2同时出现并读取A,它也会读取提交的A --它不会看到A+1,因为它还没有提交。事务2可以看到A的版本,它们是==、lastCommittedA和<=事务2。

在事务2读取A时,它还将检查A的读取时间戳,并查看事务1是否存在,并检查transaction 1时间戳< transaction 2时间戳。因为1<2,事务2将被中止,因为它已经依赖于旧值A。

(我已经用Java实现了MVCC。参见事务跑步者mvcc代码(我已经实现了Python中的btree)。)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38677780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档