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

时间:2016-08-25 22:00:24

标签: java concurrency mvcc

我正在阅读不同的并发模型和不同的并发特性,但没有文章讨论如何实现简单的MVCC数据结构。让我们说我必须实现一个简单的基于数组的数据结构,它提供了基于MVCC的并发。我的代码应该如何?

据我所知,MVCC基本上意味着:(多版本并发控制)

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

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

我是否需要记住任何其他方面?

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

-mtime


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

1 个答案:

答案 0 :(得分: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 的版本,以查看是否存在 <= transaction.getTimestamp() 的版本。如果成功,它将该值的读取时间戳设置为上次读取该值的事务。 rts.put("A", 交易)

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

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

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