首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何实现简单的MVCC数据结构

如何实现简单的MVCC数据结构
EN

Stack Overflow用户
提问于 2016-08-26 06:00:24
回答 1查看 946关注 0票数 0

我读到了不同的并发模型和不同的并发特性,但没有文本讨论如何实现简单的MVCC数据结构。假设我必须实现一个简单的基于数组的数据结构,它提供了基于MVCC的并发性。我的代码应该是什么样子的?

我理解MVCC基本上意味着:(多版本并发控制)

1)读取隔离-您的写入不应阻止读取

2)基于时间戳的排序,用于建立关系/排序之前的发生。

我还需要记住其他方面吗?

另外,下面的代码处理了第一个需求,但是如何实现时间戳排序呢?

代码语言:javascript
运行
复制
class MVCCArray{

    private int[] arr;

    MVCCArray(int n){
        arr = new int[n];
    }


    //unblocking reads
    public int getItem(int index){
        return arr[index];
    }

    //blocking writes
    public synchronized void setItem(int index, int value){
        arr[index]=value;
    }

}

PS :我想了解它是如何以通用的方式实现的。请不要解释它是如何在特定数据库中实现的。

EN

回答 1

Stack Overflow用户

发布于 2021-06-23 00:51:33

我写了一个multiversion concurrency implementation in a simulationSee the simulation runner.我的模拟模拟了100个线程,它们都试图读取和写入两个数字,A和B。它们想要将数字递增1。我们在模拟开始时将A设置为1,将B设置为2。

所需的结果是在模拟结束时将A和B设置为101和102。只有在由于多版本并发控制而存在锁定或序列化的情况下,才会发生这种情况。如果你没有并发控制,由于数据竞争,这个数字将小于101和102。

当线程读取A或B时,我们遍历键A或B的版本,看看是否有一个版本是<= transaction.getTimestamp()。如果成功,它将该值的读取时间戳设置为上次读取该值的事务。rts.put("A",事务)

在提交时,我们检查rts.get("A").getTimestamp() < committingTransaction.getTimestamp()。如果此检查为真,我们将中止事务并重试。

我们还检查是否提交( someone committed since the transaction began )-我们不想覆盖它们的提交。

平均而言,在大约4,000-11000个事务中止后,系统会达到101和102。

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

https://stackoverflow.com/questions/39155387

复制
相关文章

相似问题

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