在MySQL中严格自动递增值

时间:2013-05-02 22:40:54

标签: java mysql concurrency auto-increment

我必须使用严格的顺序ID为表(行)中的每个元素创建一个MySQL InnoDB表。 ID中不能有任何间隙 - 每个元素必须具有不同的ID,并且必须按顺序分配。并发用户在此表上创建数据。

我遇到了MySQL“自动增量”行为,如果事务失败,则不使用PK号,留下间隙。我已经阅读了在线复杂的解决方案,这些解决方案并没有说服我和其他一些没有真正解决我的问题(Emulate auto-increment in MySQL/InnoDBSetting manual increment value on synchronized mysql servers

  • 我想最大限度地提高并发性。我不能让用户在桌子上写字并等待很长时间。
  • 我可能需要对表进行分片...但仍然保持ID计数。
  • 表中元素的顺序并不重要,但ID必须是顺序的(即,如果在另一个元素之前创建元素不需要具有较低的ID,则不允许ID之间的间隙)。

我能想到的唯一解决方案是使用额外的COUNTER表来保持计数。然后用空的“ID”(不是PK)在表中创建元素,然后锁定COUNTER表,获取数字,将其写在元素上,增加数字,解锁表。我认为这样可以正常工作,但有一个明显的瓶颈:在锁定期间,没有人能够写任何ID。 此外,如果持有表的节点不可用,则是单点故障。我可以创建一个“主人”吗?复制,但我不确定这种方式我是否冒冒险使用过时的ID计数器(我从未使用过复制)。

感谢。

1 个答案:

答案 0 :(得分:2)

我很遗憾地说这一点,但是允许高并发性以实现高性能并且同时要求严格单调的序列是相互矛盾的要求。

要么你有一个控制点/失败点发出ID,并确保既没有重复也没有跳过,你必须接受这些情况中的一种或两种的机会。

如你所说,有人试图规避这类问题,但最终你会发现你需要在速度和正确性之间进行权衡,因为一旦你允许并发,你就会遇到分裂 - 大脑情况或竞争条件。

对于每个可能很多的服务器/数据库/表,可能只有严格的单调序列?