TRANSACTION,COMMIT和ROLLBACK上的MySQL自动递增列

KDa*_*awg 14 mysql transactions auto-increment decrement

当使用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
Run Code Online (Sandbox Code Playgroud)


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

Bil*_*win 41

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

重新评论:如果我可以更清楚地说出来,可以回滚交易范围的任何变化.自动递增计数器不会回滚,因此它不遵守事务的原子性.它也不服从隔离,因为即使您的事务尚未提交,另一个事务也会获得下一个值.

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

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

  • @RafaelBarros,确实如此,tinyint 对于大多数表来说通常是太小的范围。但这与自动增量的隔离无关。 (2认同)