代码之家  ›  专栏  ›  技术社区  ›  Art

表中的多个唯一计数器

  •  0
  • Art  · 技术社区  · 15 年前

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

    例如,安排多个作业的多个业务部门;job.number在一个业务部门中应该是唯一的。

    所以我基本上需要确保并发的创造就业机会的操作不会产生相同数量的就业机会。

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

    使用自锁类型的锁锁定表,比如说“share update exclusive”,因此此类型的所有其他操作都必须排队等待,从而确保max()函数始终返回唯一值。

    然而,这个解决方案似乎有一个巨大的缺点——它本质上为所有插入到jobs表中的操作创建了一个瓶颈。

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

    1. 我不想为每个新业务创建新序列
    2. 可能会有差距

    你能提出其他解决这个问题的方法吗?

    2 回复  |  直到 7 年前
        1
  •  1
  •   p.marino    15 年前

    首先,如果您只需要一个不同的数字,为什么不使用序列来生成它呢?

    如果共享序列不正常,因为会产生“间隙”(即,业务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 2生成下一个作业时,您必须只锁定business 2行,增加它,然后继续。 假设Postgres可以锁定在记录级别,那么您就可以通过这种方式使事情更具可伸缩性。

        2
  •  0
  •   nuald    15 年前

    怎么样 SELECT * FOR UPDATE 声明?

    另外,我还想注意到CreateSequence有一个“缓存”选项,因此如果您担心某些间隙,它可以更快地工作。