我需要为MVCC Snapshot隔离生成数据库时间戳。使用的典型方法:
"交易行为在SI-TM中实施如下。 TM BEGIN:生成事务的逻辑快照 通过使用原子增量获得唯一的时间戳 到全球时间戳计数器。"
在具有数百个内核的系统中使用此方法的问题在于它无法扩展。在有争议的内存位置上,硬件限制为每秒10M原子增量。
有什么想法吗?
答案 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年。