【问题标题】:Strictly auto-increment value in MySQLMySQL中的严格自增值
【发布时间】:2013-04-27 06:25:25
【问题描述】:

我必须使用表(行)中每个元素的严格顺序 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 计数器的风险(我从未使用过复制)。

谢谢。

【问题讨论】:

  • 需要连续 ID 的本质是什么?它是面向用户的价值吗?可能是因为您将该 ID 传递给用户。如果是这样,我将创建一个您传递给用户的代理 ID 值。这为您以后的设计提供了灵活性。您说“最大化写入并发”很重要,但是“不要等待很长时间”留下了很大的回旋余地——与“最大化写入并发”非常不同。一个更容易,那是哪个?将其定义为“不等待很长时间”似乎可以让您做一些额外但轻量级的工作来满足您的要求。
  • 我写了一个innodb差距答案Over Here

标签: java mysql concurrency auto-increment


【解决方案1】:

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

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

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

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

【讨论】:

  • 我猜你是对的...我知道并发 + 高可用性众所周知是不可能的。主要要求是为整个系统按顺序分配 ID(无间隙、无重复)。也许我建议的解决方案是最明智的……优先考虑正确性而不是速度
  • 高可用性不是您认为的意思....至少根据您的评论不是。高并发和保证唯一性相对容易获得,但保证连续性不是 andy rdbms 的共同特征。我知道 Oracle、DB2、Sybase、MySQL、MSSQLServer。这些都不能保证连续性。高可用性是另一回事。
  • 我的意思是强一致性和高数据可用性不能同时实现……要么我优先考虑一致性(始终获取正确的ID,但同时锁定其他访问)或数据可用性(始终获取即使不是“正确”的 ID)。在我的系统中,ID 的正确性更为重要......但我想知道是否还有其他“技巧”来提高写作性能
猜你喜欢
  • 1970-01-01
  • 2021-05-29
  • 2016-09-28
  • 2013-08-09
  • 1970-01-01
  • 2023-03-21
  • 2017-05-02
  • 2015-08-24
  • 2021-03-22
相关资源
最近更新 更多