gpt4 book ai didi

mysql - 重新使用丢失的 AUTO INCREMENT 值

转载 作者:行者123 更新时间:2023-11-29 03:05:13 24 4
gpt4 key购买 nike

我试图了解 innodb 关于重复使用 AUTO_INCREMENT 值序列中可能出现的间隙的确切行为。问题是在我看来,我在文档中发现了两个相互矛盾的描述。

  1. http://dev.mysql.com/doc/refman/5.6/en/innodb-auto-increment-configurable.html

In all lock modes (0, 1, and 2), if a transaction that generated auto-increment values rolls back, those auto-increment values are “lost”. Once a value is generated for an auto-increment column, it cannot be rolled back, whether or not the “INSERT-like” statement is completed, and whether or not the containing transaction is rolled back. Such lost values are not reused.

2。 http://dev.mysql.com/doc/refman/5.6/en/innodb-restrictions.html

When you restart the MySQL server, InnoDB may reuse an old value that was generated for an AUTO_INCREMENT column but never stored (that is, a value that was generated during an old transaction that was rolled back).

那么这些丢失的值会被重用吗?如果它们确实会在重新启动 MYSQL 服务器后被重用,那么考虑到 InnoDB 通过执行语句的等价物来确定新的 AUTO_INCREMENT 值怎么可能

SELECT MAX(ai_col) FROM t FOR UPDATE

?

最佳答案

第一种情况是正常行为和您所期望的。

第二种情况比较奇怪。

假设我们正在为写入分配 1024,但写入或事务未完成,因为 MySQL 已停止或崩溃。在某些情况下,记录了 1024 的使用情况,因此接下来将分配 1025。但是,有一个小窗口,其中 1024 的分配没有记录在启动表中。这解释了案例 2。

此外,InnoDB 实际上并没有为新分配执行真正的 MAX(但 MyISAM 执行)。它是等价的。但是它确实会在启动时执行此操作

另见这些

更新。

问题中的第一个链接 ( http://dev.mysql.com/doc/refman/5.6/en/innodb-auto-increment-traditional.html ) 解释了该行为。在链接失效的情况下选择下面的引号:

If you specify an AUTO_INCREMENT column for an InnoDB table, the table handle in the InnoDB data dictionary contains a special counter called the auto-increment counter that is used in assigning new values for the column. This counter is stored only in main memory, not on disk

因此,这是一个运行时的事情,其中​​数字与实际表格分开递增。这解释了差距:新值的分配与写入不同。

InnoDB uses the following algorithm to initialize the auto-increment counter for a table t that contains an AUTO_INCREMENT column named ai_col: After a server startup, for the first insert into a table t, InnoDB executes the equivalent of this statement:

因此,由于服务器重启而导致分配成功但写入失败的操作将被丢弃。

关于mysql - 重新使用丢失的 AUTO INCREMENT 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16708748/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com