【问题标题】:How to implement simple MVCC datastructure如何实现简单的 MVCC 数据结构
【发布时间】:2016-08-25 22:00:23
【问题描述】:

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

我理解MVCC基本上是指:(多版本并发控制)

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

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

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

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

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:我想了解它是如何以通用方式实现的。请不要解释它是如何在特定数据库中实现的。

【问题讨论】:

  • MVCC 在事务上下文(如数据库)之外没有多大价值。这个想法是您的写入不会替换现有数据,它们会创建一个副本并在那里进行更改,因此并发事务中的读取会看到旧数据。
  • @cHao:谢谢你们的cmets。我知道读取可能会看到旧数据。我想了解如何在代码中实现这一点。
  • 就是这样。不可能。 。这是 MVCC 的设计目标之一:在写入之前已经在进行的事务可以看到写入之前的数据,尤其是在修改数据的事务尚未提交的情况下。当您就地修改数据时,您离 MVCC 还很远。
  • 你的意思是......像我上面的代码那样有一个setter方法不是应该如何实现MVCC?是否有任何示例代码或实现可以作为示例参考?
  • 当然,那里有实现。例如,在 PostgreSQL 中。但是您不想要特定于数据库的解释,而且我想不出像您显然想要的那样的玩具实现。 MVCC 比您想象的要复杂得多,如果有人努力在 SO 的帖子中详细介绍它,我会感到非常惊讶。

标签: java concurrency mvcc


【解决方案1】:

我写了一个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 的版本,以查看是否存在

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

我们还检查someone committed since the transaction began - 我们不想覆盖他们的提交。

我们还检查每个写入 other 写入事务是否比我们年轻,然后我们中止。 if 语句看起来像这样 - if (other.getTimestamp() < transaction.getTimestamp() || other.getPrecommit() && other.getTimestamp() > transaction.getTimestamp() && !other.getRestart()) { or 意味着如果后面的事务提前并且后面的事务尚未重新启动(中止),则较年轻的事务可以中止。预提交发生在提交开始时。

在读取密钥期间,我们检查 RTS 以查看它是否低于我们的事务的读取。如果是这样,我们将中止事务并重新启动 - 队列中有人在我们前面,他们需要提交。

平均而言,系统在大约 4000-11000 次事务中止后达到 101 和 102。

【讨论】:

    猜你喜欢
    • 2011-07-07
    • 1970-01-01
    • 1970-01-01
    • 2015-07-24
    • 2017-07-04
    • 1970-01-01
    • 2018-12-31
    • 2011-02-07
    • 2015-08-16
    相关资源
    最近更新 更多