The auto-increment counter is stored only in main memory, not on disk.
因此,当服务(或服务器)重新启动时,将发生以下情况:
After a server startup, for the first insert into a table t, InnoDB
executes the equivalent of this statement: SELECT MAX(ai_col) FROM t
FOR UPDATE;
InnoDB increments by one the value retrieved by the statement and
assigns it to the column and to the auto-increment counter for the
table. If the table is empty, InnoDB uses the value 1.
所以用简单的英语,在MySQL服务启动后,它不知道你的表的自动增量值应该是多少.因此,当您第一次插入行时,它会找到使用自动增量的字段的最大值,将此值加1,并使用结果值.如果没有行,则从1开始.
这对我们来说是一个问题,因为我们使用表和mysql的自动增量功能在多线程环境中巧妙地管理ID,用户将这些ID重新定向到第三方支付站点.因此,我们必须确保第三方获得的ID并发回给我们的ID是唯一的并且将保持这种方式(当然,用户可能会在重定向后取消该交易).
因此,我们创建了一行,获取生成的自动增量值,删除行以保持表清洁,并将值转发到付款站点.我们最终做的是解决InnoDB处理AI值的方式问题如下:
$query = "INSERT INTO transactions_counter () VALUES ();";
mysql_query($query);
$transactionId = mysql_insert_id();
$previousId = $transactionId - 1;
$query = "DELETE FROM transactions_counter WHERE transactionId='$previousId';";
mysql_query($query);
这始终将最新的transactionId保存为表中的一行,而不会不必要地炸毁表.
希望能帮助其他可能遇到此问题的人.
编辑(2018-04-18):
正如下面提到的Finesse一样,它的行为似乎已经在MySQL 8.0中被修改.
该工作日志中的措辞充其量是错误的,但是现在看来InnoDB在那些较新的版本中支持重新启动时的持久autoinc值.
-Gremio