mysql auto\u increment innodb\u autoinc\u lock\u mode=2,但有时仍按顺序填充

7dl7o3gd  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(400)

我的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 在集群环境中是个坏主意?
寻找关于如何实现无差距发票编号的最佳建议。

slwdgvem

slwdgvem1#

你对我的要求太高了 AUTO_INCREMENT . 它保证了一个唯一的数字。期间;句号。 auto_increment_increment 大于1是“主-主”复制首次使用的防止DUP的技术。后来各种“集群”解决方案采取了相同的策略。因为它有效。
我注意到你的单子上偶尔有个奇数。一个主机是偶数,另一个是奇数,但插入频率较低。任何试图避免差距的做法都会大大减慢处理速度。对于99.9%的用户来说,这比担心差距更重要。
我还没讲完呢。有几种情况下会出现间隙。显然,一个 DELETE 会留下缺口。但有时会留下新的缺口: INSERT IGNORE ,碘库, REPLACE , ROLLBACK . 类似地,您不能相信这些值会单调递增。 innodb_autoinc_lock_mode 在某些情况下可能会有所帮助,但在其他情况下不会。当开发人员发现了一种稍微快一点的人工智能方法,但又一次以牺牲价值的可预测性为代价时,它被添加了进来。
好的,您希望连续的发票号码永远不会被删除,等等。您最好的办法是有一个获得“下一个”发票号码的“服务”(api)。想象一个表,一行一列。并编写一个存储过程来递增该数字并将其返回给客户端。然后客户在任何需要发票号码的地方使用该号码。
您可以根据请求发票编号的时间使编号连续。根据插入发票的时间,很难使它们连续。作为一个“发票”,你应该删除它们,但是应该有一些“删除”标志来处理错误、取消等等。

相关问题