我目前正在阅读dbms书籍,据我所知,Mvcc (多版本并发控制)用于高并发读写事务。但是“搜索结构的并发控制”一章提到了B树的不同锁定概念(锁耦合、链接技术等)。
Mvcc不适用于数据库管理系统中B树的内部和叶节点吗?B树并发和MVCC完全不同吗?如果是的话,Mvvc是如何在dbms中实现的?
发布于 2016-07-30 20:40:27
MVCC可以通过多种方式实现。唯一的要求是,在某种程度上,旧行版本是可用的。
例如,Server将它们存储在服务器重新启动时重置的临时数据库中。
Postgres将行版本作为隐藏行直接存储在b-树中。它向树中添加一个隐藏键列。当从树中读取时,只公开逻辑上应该看到的版本。
RavenDB的Voron将b树页面管理为不可变的数据。写作创造了全新的树。因此,MVCC被实现为从正确的不可变树中读取。
数据库很少在较长的时间内锁定物理结构。让数据库客户端停止数据库内部结构的进度并不是一个好主意。内部结构通常是非常短暂的锁定。逻辑行锁分别处理。
如果我不得不猜测,concurrency control on search structures指的是物理线程安全。这通常不涉及MVCC,因为不需要管理多个版本。内存中的普通锁对于短暂的访问来说已经足够了.
发布于 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)。)
https://stackoverflow.com/questions/38677780
复制相似问题