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

时间:2018-11-09 16:36:50

标签: mysql sequence primary-key innodb auto-increment

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

710
712
714
716
718

等... 很好。

但是在某些记录中,我有:

720
722
723
724
725
726
728
730

等...

应该始终遵循以2为增量的增量,还是更多建议?

我们有一个集群环境,这就是为什么他的增量为2。 试图避免可能发生的按键碰撞。

我们需要遵循一些开具发票的准则,并证明发票编号中的空缺顺序。 由于我们使用主键ID作为发票编号,因此这会导致序列混乱。

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

正在寻找有关如何实现无间隙发票编号的最佳建议。

1 个答案:

答案 0 :(得分:0)

您向AUTO_INCREMENT提出的要求过多。它保证了唯一的号码。期;句号。

auto_increment_increment大于1是“ Master-Master”复制首先用于防止复制的技术。后来,各种“集群”解决方案采用了相同的策略。因为它有效。

我注意到您列表中偶尔有个奇数。一个Master在做偶数,另一个在做奇数,但是插入频率降低。避免这些间隙的任何尝试都会显着减慢处理速度。对于99.9%的用户,这比担心差距更为重要。

我没有讲课。在某些情况下,会出现差距。显然,DELETE将留下一个空白。但是这些有时会 留下新的空白:INSERT IGNORE,IODKU,REPLACEROLLBACK。同样,您不能相信这些值会单调增加。

innodb_autoinc_lock_mode在某些情况下可能会有所帮助,但在其他情况下则无济于事。当开发人员发现一种更快的AI方式时添加了它,但又以价值的可预测性为代价。

好的,您希望连续的发票编号永远不会被删除,依此类推。最好的选择是让“服务”(API)获得“下一个”发票编号。假设一张表只有一行一行。并编写一个存储过程,使该数字递增并将其返回给客户端。然后,客户在需要发票编号的任何地方都使用该编号。

您可以根据要求发票编号的时间使编号连续 。根据插入发票的时间来使其连续可能非常困难。作为“发票”,您可能应该删除它们,而应使用某种“已删除”标志来处理错误,取消等。