我的mysql my.cnf文件设置为innodb\u autoinc\u lock\u mode=2,但查看表时,主键有时不遵循该规则。我主要有:
710
712
714
716
718
等。。。这很好。
但在我的一些记录中:
720
722
723
724
725
726
728
730
等。。。
增量2应该一直跟在后面,还是更像一个建议?
我们有一个集群环境,这就是为什么他有增量2集。试图避免可能的键冲突。
我们需要遵循一些关于发票的指导方针,并证明在发票编号上是一个无差距的序列。这会导致序列出现问题,因为我们使用主键id作为发票号。
正在设置 innodb_autoinc_lock_mode = 1
在集群环境中是个坏主意?
寻找关于如何实现无差距发票编号的最佳建议。
1条答案
按热度按时间slwdgvem1#
你对我的要求太高了
AUTO_INCREMENT
. 它保证了一个唯一的数字。期间;句号。auto_increment_increment
大于1是“主-主”复制首次使用的防止DUP的技术。后来各种“集群”解决方案采取了相同的策略。因为它有效。我注意到你的单子上偶尔有个奇数。一个主机是偶数,另一个是奇数,但插入频率较低。任何试图避免差距的做法都会大大减慢处理速度。对于99.9%的用户来说,这比担心差距更重要。
我还没讲完呢。有几种情况下会出现间隙。显然,一个
DELETE
会留下缺口。但有时会留下新的缺口:INSERT IGNORE
,碘库,REPLACE
,ROLLBACK
. 类似地,您不能相信这些值会单调递增。innodb_autoinc_lock_mode
在某些情况下可能会有所帮助,但在其他情况下不会。当开发人员发现了一种稍微快一点的人工智能方法,但又一次以牺牲价值的可预测性为代价时,它被添加了进来。好的,您希望连续的发票号码永远不会被删除,等等。您最好的办法是有一个获得“下一个”发票号码的“服务”(api)。想象一个表,一行一列。并编写一个存储过程来递增该数字并将其返回给客户端。然后客户在任何需要发票号码的地方使用该号码。
您可以根据请求发票编号的时间使编号连续。根据插入发票的时间,很难使它们连续。作为一个“发票”,你应该删除它们,但是应该有一些“删除”标志来处理错误、取消等等。