我有一个问题,我需要保留并增加表中的对象编号字段,但是这个编号在给定的逻辑域中应该是唯一的,而不是全局的表。
一个例子是多个企业调度多个工作; Job.Number在业务中应该是唯一的。
所以我基本上需要确保并发作业创建操作不会生成具有相同Number的作业。
目前我只看到一种实现方法(在postresql中):
使用自锁类型的锁来锁定表,例如“SHARE UPDATE EXCLUSIVE”,因此此类型的所有其他操作都必须排队等待,从而确保MAX()函数始终返回唯一值。
然而,该解决方案似乎存在一个巨大的缺点 - 它实际上为所有INSERT操作创建了一个瓶颈到了Jobs表中。
我认为我不能使用Postgreql序列,因为:
你会建议其他任何方法来处理这个问题吗?
答案 0 :(得分:1)
首先,如果您只需要一个不同的数字,为什么不使用序列来生成它?
如果共享序列不正确,因为会产生“差距”(即,业务#1工作可以编号为1,2,5,6,23,业务#2工作可以获得4,7,8,20和所以)或者出于某种原因,为什么不建立一个“工作柜台”表:
> Business ID | Job Counter
----------------------------
> Business #1 | 23
> Business #2 | 3
> Business #3 | 11
> Business #4 | 76
因此,当您必须生成下一个Business for Business#2时,您必须仅锁定Business#2行,递增它并继续。 假设Postgres可以锁定在记录级别,那么你可以通过这种方式提高可扩展性。
答案 1 :(得分:0)
SELECT * FOR UPDATE陈述怎么样?
另外我想注意CREATE SEQUENCE有一个“CACHE”选项,所以如果你担心一些空白,它可以更快地工作。