我需要为 MVCC 快照隔离生成数据库时间戳。 使用的典型方法:
"事务操作在SI-TM中实现如下。TM BEGIN:生成事务的逻辑快照通过使用原子增量获取唯一时间戳到全局时间戳计数器。
在具有数百个内核的系统中使用此方法的问题在于它无法扩展。 在有争议的内存位置上,硬件限制为每秒 10M 个原子增量。
有什么想法吗?
这里有两个简单的想法,以及一个论文参考:
1) 不是将计数器递增 1,而是递增 N,从而有效地为客户端提供一系列交易标识符 [c, c+N)。例如,如果 N=5,并且计数器的初始值为 1,则客户端 A、B 和 C 将得到以下内容:
A: [1, 2, 3, 4, 5]
B: [6, 7, 8, 9, 10]
C: [11, 12, 13, 14, 15]
虽然这减少了原子计数器的压力,但正如我们从此示例中看到的那样,一些客户端(如客户端 C)将获得相对较高的 id 范围,而其他客户端将获得较低的范围(客户端 A),这将导致系统中更高的中止率。
2) 使用交错交易标识符的范围。这类似于 1,但我们添加了一个步长变量 S。下面是一个简单的示例:如果 N=5 和 S=3,并且计数器的初始值为 1,则客户端 A B 和 C 将得到以下内容:
A: [1, 4, 7, 10, 13]
B: [2, 5, 8, 11, 14]
C: [3, 6, 9, 12, 15]
这似乎已经解决了 1 的问题,但考虑客户端 D:
D: [16, 19, 22, 25, 28]
现在我们回到了解决方案#1的相同问题。必须用这种技术玩弄技巧才能"正确"。
3) 这里描述了一种有趣但更复杂的去中心化交易 ID 分配方式:
涂、斯蒂芬、郑文婷、埃迪·科勒、芭芭拉·利斯科夫和塞缪尔·马登。"多核内存数据库中的快速事务。"第二十四届 ACM 操作系统原理研讨会论文集,第 18-32 页。ACM, 2013.