我有一张表,基本上可以视为三元组的集合(id,key,sequence_number)。 我需要使用相同的键顺序编号记录。一段时间后的表格内容可能是(忽略id字段,无关紧要):
("aaa", 5)
("bbb", 12)
("aaa", 6)
("ccc", 1)
("aaa", 7)
("bbb", 13)
值必须是连续的,序列中没有间隙。我如何以便宜的方式在多进程环境中实现这一点(没有锁定所有内容,最好没有悲观锁定)? 插入相同密钥的值很少(使用给定密钥的几个条目,数十万个密钥)
另一种方法是使用一个表(key,last_sequence_number)来存储给定密钥的最新序列号。这很容易更新(悲观或乐观锁定)。但是,有没有办法有效地使用以前的方法?
编辑: 我想实施https://www.youtube.com/watch?v=Ef9W2whkCeE(大约第6分钟)。不,我可能不需要我上面要求的内容,但我想知道如何实现它。
答案 0 :(得分:1)
根据您的要求:
值必须是连续的,序列中没有间隙
我不明白为什么你仍然存储不符合的值:例如对于aaa
,存在间隙和重复值。根据您为什么需要该序列号,您可能最好存储带有间隙的保证唯一增加数字,例如时间戳或常规SQL序列值,这两者都不会需要锁定,并使用其中一个OLAP函数生成无间隙编号:row_number()
或dense_rank()
。