gpt4 book ai didi

MySQL AUTO_INCRMENT 不回滚

转载 作者:行者123 更新时间:2023-11-29 16:36:10 26 4
gpt4 key购买 nike

我使用 MySQL 的 AUTO_INCRMENT 字段和 InnoDB 来支持事务。我注意到当我回滚事务时,AUTO_INCRMENT 字段没有回滚?我发现它是这样设计的,但是有什么解决方法吗?

最佳答案

这样不行。考虑:

  • 程序一,您打开一个事务并插入到具有 autoinc 主键的表 FOO 中(任意地,我们说它的键值是 557)。
  • 程序二启动,它打开一个事务并插入到表 FOO 中,得到 558。
  • 将两个插入编程到表 BAR 中,该表有一列是 FOO 的外键。所以现在 558 位于 FOO 和 BAR 中。
  • 程序二现已提交。
  • 程序三启动并从表 FOO 生成报告。 558 记录已打印。
  • 之后,程序一回滚。

数据库如何回收557值?它是否会进入 FOO 并递减所有其他大于 557 的主键?它如何修复 BAR?它如何删除打印在报告程序三个输出上的558?

出于同样的原因,Oracle 的序列号也独立于事务。

如果你能在恒定的时间内解决这个问题,我相信你可以在数据库领域赚很多钱。

现在,如果您要求自动增量字段永远不会有间隙(例如,出于审计目的)。那么您就无法回滚您的交易。相反,您需要在记录上有一个状态标志。第一次插入时,记录的状态为“不完整”,然后您开始事务,完成工作并将状态更新为“竞争”(或您需要的任何内容)。然后,当您提交时,记录就会生效。如果事务回滚,不完整的记录仍然存在以供审计。这会给您带来许多其他麻烦,但这是处理审计跟踪的一种方法。

关于MySQL AUTO_INCRMENT 不回滚,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53602695/

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