1

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

我经历过 MySQL“自动增量”行为,如果事务失败,则不使用 PK 号,留下一个空白。我已经阅读了无法说服我的在线复杂解决方案以及其他一些并没有真正解决我的问题的解决方案(在 MySQL/InnoDB中模拟自动增量,在同步的 mysql 服务器上设置手动增量值

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

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

谢谢。

4

1 回答 1

2

我很抱歉这么说,但允许高并发实现高性能,同时要求严格单调序列是相互矛盾的要求。

要么您有一个单点控制/故障来发布 ID 并确保既没有重复也没有跳过一个,或者您将不得不接受其中一种或两种情况的机会。

正如您所说,有一些尝试来规避此类问题,但最终您总是会发现您需要在速度和正确性之间进行权衡,因为一旦您允许并发,您就会遇到脑裂的情况或竞争条件。

也许对于可能许多服务器/数据库/表中的每一个来说,一个严格的单调序列都可以吗?

于 2013-05-02T22:48:30.297 回答