当前位置: 首页 > 面试题库 >

有关TRANSACTION,COMMIT和ROLLBACK的MySQL自动增量列

冯阳成
2023-03-14
问题内容

当使用MySQL START TRANSACTION并由MySQL决定回滚时-如果表具有AUTO_INCREMENT列-在回滚过程中该列是否会递减?

还是应该?

我在适当地回滚事务数据时遇到一些问题-但表似乎在回滚中已自动递增而不递减。

# BOTH TABLES START OUT EMPTY // TABLE1 ID is **auto_increment**

START TRANSACTION;

INSERT INTO `TABLE1` (`ID` ,`NAME`) VALUES (NULL , 'Ted');  # MySQL TABLE1 **ID** is Auto incremented to 1

INSERT INTO `TABLE2` (`ID` ,`WRONGVALUE`) VALUES (NULL , 'some value');  # error. This TRANSACTION will not succeed

COMMIT;  # Because of the error - this TRANSACTION is now rolled back and Ted is NOT added

因为MySQL会自动递增第一个表上的ID(无论事务是成功还是失败),这是您自己递减表的标准做法吗?


问题答案:

不可以,自动递增机制 必须
在事务范围之外起作用,因为在完成事务之前,其他用户可能正在插入同一张表。在知道您的事务是否使用您刚分配的值之前,其他用户的事务必须能够分配下一个值。

关于您的评论:如果我可以说得更清楚一些,那么交易范围的任何变化都可能被回滚。自动增量计数器不会回滚,因此不会服从事务的 原子性 。它也没有服从
隔离, 因为即使您的事务尚未提交,另一个事务也会获得下一个值。

自动增量的工作方式意味着,有时,如果您插入一些行然后回滚事务,则使用自动增量分配的值将永远丢失!

但这没关系。主键值必须是唯一的,但不必是连续的。换句话说,它们不是行号,因此您不应那样使用它们。因此,您永远不需要减少由自动增量创建的值。



 类似资料:
  • 问题内容: 我有多个结构相同的数据库,有时会在其中复制数据。为了保持数据完整性,我使用两列作为主键。一个是数据库ID,它链接到包含有关每个数据库的信息的表。另一个是表键。它不是唯一的,因为它可能有多个行,且此值相同,但database_id列中的值不同。 我打算将这两列变成一个联合主键。但是,我也想将表键设置为自动递增-但基于database_id列。 EG,使用以下数据: 如果我要添加包含dab

  • 问题内容: 我正在尝试在mysql数据库中创建一列,该列自动递增1但从0-Z开始然后滚动。 例如000、001、002,…,009、00A,00B,…,00Z,010,…,0ZZ,…,100。 我想让数据库通过自动递增字段创建列。 我的想法是: 为从0到36的每个字符创建一列,然后将行N(其中N是最低有效数字)自动递增1。然后在每列上添加触发器,以在第N列达到36时向N-1列添加1 。 创建一个包

  • 问题内容: 我正在使用php和mysql。我有一个表,其中id列设置为自动递增作为主键。我正在尝试添加另一个名为sort_order的列。插入行后,sort_order列应自动递增。然后,用户将能够更改sort_order值。但是mysql不允许多于一列的自动递增? 自动递增sort_order值的最佳方法是什么? 受欢迎的要求,更多的解释。 在管理区域中,用户将具有类别列表。用户可以使用java

  • 问题内容: 我有一个带有自动递增主键的MySql表,并且似乎所有各种upsert方法(INSERT IGNORE和ON DUPLICATE KEY UPDATE)都具有自动递增字段递增甚至递增的功能。如果行已更新但未插入。这意味着将间隙引入表中,我发现这是不希望的。 因此,问题是:是否有任何方法可以在具有自动递增字段的表中向上插入记录, 而无需 自动递增该字段,如果实际上仅由向上插入来更新该行。在

  • 问题内容: 考虑以下: 题: 我注意到该事务自动回滚,并且记录插入尝试失败。 如果我没有像上面一样提供错误处理程序或错误检查,是否安全,因为它从未执行过,因此在上述示例中似乎可以完成工作? 我认为事务会立即回滚并在发生错误时立即丢弃。 问题答案: 不,一旦发生错误,事务不会回滚。但是您可能正在使用应用此策略的客户端应用程序。 例如,如果您使用的是mysql命令行客户端,则它通常会在发生错误时停止执

  • 问题内容: 是否可以自动增加非主密钥? 表“ book_comments” 该表上将没有其他索引。但是,我想使列自动递增,以便可以轻松创建另一个表: 表格“ book_comments_votes” 用户将只能对每个书评进行一次投票。该表通过主键强制执行此规则。 题: 是否可以自动增加非主键-例如,自动增加表“ book_comments”中的列? 替代方案,讨论: 如上所述,我想这样做是为了简化