一尘不染

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

mysql

当使用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(无论事务是成功还是失败),这是您自己递减表的标准做法吗?


阅读 258

收藏
2020-05-17

共1个答案

一尘不染

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

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

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

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

2020-05-17