gpt4 book ai didi

mysql - 为什么 MySQL AI id 会这样?

转载 作者:行者123 更新时间:2023-11-29 04:21:22 25 4
gpt4 key购买 nike

假设我有一个简单的 3 列表。

CREATE TABLE `test1` (

id INT,
name VARCHAR(40),
age INT,
PRIMARY KEY (id)
);

如果我然后将 5 个值插入表中,将有 5 条记录。每条记录的 id 范围为 1 - 5。如果我要删除 4 条记录,留下 id 为 1 的记录,然后插入又是 4 条记录,为什么不是从 id=2 开始,而是从 6 开始?

最佳答案

这是一个解释为什么它不能在 DELETE 时递减 AI 的场景:

  1. Ashley 启动事务并删除 id=2id=5 的行。但 Ashley 没有立即 promise 。

  2. Bill 开始他自己的事务并插入一个新行。由于 id 值 2 到 5 已被删除,因此它们将被抢购。 Bill 的行得到 id=2

  3. Ashley 回滚第一笔交易。因此 id=2id=5 的行返回。
    但是 Bill 的交易已经插入了一个新行 id=2!

另一种方法是根据每个事务可以看到的内容进行递增,并忽略未提交的更改:

  1. Ashley 删除了 id=2id=5 的行。先不要提交。

  2. Bill 开始他自己的事务并插入一个新行。由于 id 值 2 到 5 似乎仍然存在于 Bill 的数据 View 中,因此不要使用它们。分配 id=6

  3. Ashley 提交第一笔交易。因此,从 id=2id=5 的行都消失了,而 Bill 的行的值为 id=6,导致了一个神秘的差距!

避免这种情况的唯一其他方法是使所有事务序列化。换句话说,Bill 的 INSERT 必须等到 Ashley 的事务解决。最好避免这种情况,并允许并发插入。

因此,AI 机制必须在交易范围之外发挥作用。并发事务可以“看到”表的最新 AI 值,即使有未提交的事务正在进行中。防止重复使用值的唯一方法是始终递增,永不递减。

这确实会不时导致“差距”。这是正常的,也是意料之中的。 AI key 不需要连续,只需要唯一即可。

关于mysql - 为什么 MySQL AI id 会这样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22947553/

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