【发布时间】: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