MySQL auto_increment innodb_autoinc_lock_mode = 2 但有时仍按顺序填充

MySQL auto_increment innodb_autoinc_lock_mode = 2 but still populating in sequence sometimes

我有 MySQL my.cnf 文件设置 innodb_autoinc_lock_mode = 2 但查看 table,主键有时不遵循该规则。 我主要有:

710
712
714
716
718

等... 这很好。

但在一些记录中我有:

720
722
723
724
725
726
728
730

等...

应该始终遵循增加 2 还是更多的建议?

我们有集群环境,所以他设置了增量2。 试图避免可能的键冲突。

我们需要遵循一些发票开具准则,并证明发票编号顺序没有间断。 这导致序列出现问题,因为我们使用主键 ID 作为发票编号。

在集群环境中设置 innodb_autoinc_lock_mode = 1 是个坏主意吗?

寻找有关如何实现无缝发票编号的最佳建议。

你对 AUTO_INCREMENT 的要求过高。它保证了唯一的编号。时期;句号。

auto_increment_increment 大于 1 是 "Master-Master" 复制首次使用的防止重复的技术。后来各种 "cluster" 解决方案采用了相同的策略。因为它有效。

我注意到您的列表中偶尔出现奇数。一位大师在做偶数,另一位大师在做奇数,但插入频率较低。任何避免间隙的尝试都会显着 减慢处理速度。对于99.9%的用户来说,这比担心差距更重要

我不是通过讲课。几种会出现差距的情况。显然,一个 DELETE 会留下一个缺口。但这些 有时 会留下新的空白:INSERT IGNORE、IODKU、REPLACEROLLBACK。同样,您不能相信这些值会单调递增。

innodb_autoinc_lock_mode 在某些情况下可能有帮助,但在其他情况下可能没有帮助。它是在开发人员发现一种稍微更快的 AI 方法时添加的,但同样以价值的可预测性为代价。

好的,您想要连续的 发票编号 ,它们永远不会被删除,等等。您最好的选择是 'service' (API)获取 "next" 发票编号。想一想具有一行一列的 table。并编写一个存储过程来递增该数字并将其 returns 发送给客户端。然后客户在需要发票编号的任何地方使用该编号。

您可以根据请求发票编号的时间使编号连续。根据插入发票的时间,可能很难使它们连续。作为一个 "invoice",你可能永远都应该删除它们,而是使用某种 "deleted" 标志来处理错误、取消等。