表中有多个唯一计数器

时间:2010-02-16 09:41:39

标签: sql insert locking unique

我有一个问题,我需要保留并增加表中的对象编号字段,但是这个编号在给定的逻辑域中应该是唯一的,而不是全局的表。

一个例子是多个企业调度多个工作; Job.Number在业务中应该是唯一的。

所以我基本上需要确保并发作业创建操作不会生成具有相同Number的作业。

目前我只看到一种实现方法(在postresql中):

使用自锁类型的锁来锁定表,例如“SHARE UPDATE EXCLUSIVE”,因此此类型的所有其他操作都必须排队等待,从而确保MAX()函数始终返回唯一值。

然而,该解决方案似乎存在一个巨大的缺点 - 它实际上为所有INSERT操作创建了一个瓶颈到了Jobs表中。

我认为我不能使用Postgreql序列,因为:

  1. 我不想为每个新业务创建新序列
  2. 可能有空白
  3. 你会建议其他任何方法来处理这个问题吗?

2 个答案:

答案 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”选项,所以如果你担心一些空白,它可以更快地工作。