2013-05-02 112 views
1

我必须使用表(行)中的每个元素的严格顺序ID来创建MySQL InnoDB表。 ID中不能有任何空白 - 每个元素必须有不同的ID,并且它们必须按顺序分配。并发用户在此表上创建数据。在MySQL中严格自动增加值

我遇到过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

需要连续ID的性质是什么?这是一个面向用户的价值吗?也许是因为您将该ID传递给用户。如果是这样,我会创建一个代理ID值,您传递给用户。这给你以后的设计灵活性。 你说“最大化写入并发性”很重要,但是“不要等很长时间”会留下很多回旋余地 - 与“最大化写入并发性”非常不同。一个更容易,那是哪个呢? 将它定义为“不要等很长时间”似乎可以让你做一些额外的,但轻量级的工作来满足你的要求。 – gillyspy 2013-05-03 04:12:46

+0

我写了一个innodb差距答案[在这里](http://stackoverflow.com/a/38363271) – Drew 2016-07-14 00:12:21

回答

2

我很抱歉地说这个,但是允许高并发性来实现高性能和在同一时间要求一个严格的单调序列是冲突的要求。

要么你必须控制/单一故障点发出的ID,并确保有没有重复,也不是一个跳过,你将不得不接受一个或这两种情况的机会。

正如你所说的,有人试图绕过这类问题,但最终你会发现你需要在速度和正确性之间进行权衡,因为只要你允许并发,你就可以运行裂脑情况或种族状况。

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

+0

我想你是对的...我知道并发+高可用性已知是不可能的。主要要求是对整个系统顺序分配ID(无间隙,不重复)。也许我建议的解决方案是最明智的解决方案......优先考虑速度的正确性 – user1156544 2013-05-02 22:54:02

+0

高可用性不是您认为的意思....至少不是根据您的意见。高并发性和保证唯一性相对容易,但保证连续性不是* andy * rdbms的共同特征。我了解Oracle,DB2,Sybase,MySQL,MSSQLServer。这些都不能保证连续性。高可用性还有其他问题。 – rolfl 2013-05-02 23:05:57

+0

我的意思是强大的一致性和高数据可用性不能同时实现......要么我会优先考虑一致性(总是获得正确的ID,而是要锁定其他访问)或数据可用性(尽管不是“正确”一个)。在我的系统中,ID的正确性更重要......但我想知道是否还有其他“技巧”来提高写作表现 – user1156544 2013-05-03 16:49:14