并发数据库MVCC时间戳生成方法

时间:2016-07-14 23:50:50

标签: parallel-processing atomic database-concurrency mvcc nosql

我需要为MVCC Snapshot隔离生成数据库时间戳。使用的典型方法:

"交易行为在SI-TM中实施如下。 TM BEGIN:生成事务的逻辑快照 通过使用原子增量获得唯一的时间戳 到全球时间戳计数器。"

在具有数百个内核的系统中使用此方法的问题在于它无法扩展。在有争议的内存位置上,硬件限制为每秒10M原子增量。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

以下是两个简单的想法和论文参考:

1)不是将计数器递增1,而是将其递增N,从而为客户提供有效的一系列事务标识符[c,c + N]。例如,如果N = 5,并且计数器的初始值为1,则客户端A,B和C将获得以下内容:

@media (max-width: 767px) {
  .row-offcanvas-left .sidebar-offcanvas {
    position: static;
    width: 200px;
    margin-left: -200px;
    overflow: hidden;
    height: 0;
  }
  .row-offcanvas-left.active .sidebar-offcanvas {
    height: auto;
  }
  .row-offcanvas-left.active {
    left: 200px;
  }
}

虽然这减轻了原子计数器的压力,但正如我们从这个例子中可以看到的,一些客户端(如客户端C)将获得相对较高的ID范围而其他客户端获得较低范围(客户端A),这将导致系统中的中止率更高。

2)使用 interleaved 事务标识符的范围。这就像1,但我们添加了一个步变量S.这是一个简单的例子:如果N = 5且S = 3,并且计数器的初始值为1,那么客户AB和C将得到以下结果:

A: [1, 2, 3, 4, 5]
B: [6, 7, 8, 9, 10]
C: [11, 12, 13, 14, 15]

这似乎解决了1的问题,但考虑客户端D:

A: [1, 4, 7, 10, 13]
B: [2, 5, 8, 11, 14]
C: [3, 6, 9, 12, 15]

现在我们回到解决方案#1遇到的同样问题。必须用这种技巧来玩“正确”。

3)这里描述了一种有趣但更复杂,分散的分配交易ID的方式:

Tu,Stephen,Wenting Zheng,Eddie Kohler,Barbara Liskov和Samuel Madden。 “多核内存数据库中的快速交易。” “第二十四届ACM操作系统原理研讨会论文集”,第18-32页。 ACM,2013年。