【发布时间】:2013-04-27 06:25:25
【问题描述】:
我必须使用表(行)中每个元素的严格顺序 ID 创建一个 MySQL InnoDB 表。 ID 中不能有任何间隙——每个元素必须有不同的 ID,并且必须按顺序分配。并发用户在此表上创建数据。
我经历过 MySQL“自动增量”行为,如果事务失败,则不使用 PK 号,留下一个空白。我已经阅读了无法说服我的在线复杂解决方案以及其他一些并不能真正解决我的问题的解决方案(Emulate auto-increment in MySQL/InnoDB,Setting manual increment value on synchronized mysql servers)
- 我想最大化写入并发。我不能让用户在桌子上写字并等待很长时间。
- 我可能需要对表进行分片...但仍保留 ID 计数。
- 表中元素的顺序并不重要,但 ID 必须是连续的(即,如果一个元素在另一个元素之前创建,则不需要具有较低的 ID,但 ID 之间不允许有间隙)。
我能想到的唯一解决方案是使用额外的 COUNTER 表来保持计数。然后用空“ID”(不是PK)在表中创建元素然后锁定COUNTER表,获取数字,写在元素上,增加数字,解锁表。我认为这会很好,但有一个明显的瓶颈:在锁定期间,没有人能够写任何 ID。 此外,如果持有该表的节点不可用,则会出现单点故障。我可以创建一个“大师-大师”吗?复制,但我不确定这种方式是否会冒使用过期 ID 计数器的风险(我从未使用过复制)。
谢谢。
【问题讨论】:
-
需要连续 ID 的本质是什么?它是面向用户的价值吗?可能是因为您将该 ID 传递给用户。如果是这样,我将创建一个您传递给用户的代理 ID 值。这为您以后的设计提供了灵活性。您说“最大化写入并发”很重要,但是“不要等待很长时间”留下了很大的回旋余地——与“最大化写入并发”非常不同。一个更容易,那是哪个?将其定义为“不等待很长时间”似乎可以让您做一些额外但轻量级的工作来满足您的要求。
-
我写了一个innodb差距答案Over Here
标签: java mysql concurrency auto-increment