这里有两个简单的想法,以及一篇论文参考:
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) 使用interleaved 事务标识符的范围。这就像 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 分配方式:
Tu、Stephen、Wenting Zheng、Eddie Kohler、Barbara Liskov 和 Samuel Madden。 “多核内存数据库中的快速事务。”在第 24 届 ACM 操作系统原理研讨会论文集上,第 18-32 页。 ACM,2013 年。