我读到了不同的并发模型和不同的并发特性,但没有文本讨论如何实现简单的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 :我想了解它是如何以通用的方式实现的。请不要解释它是如何在特定数据库中实现的。
发布于 2021-06-23 00:51:33
我写了一个multiversion concurrency implementation in a simulation。See 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。
https://stackoverflow.com/questions/39155387
复制相似问题