繁体   English   中英

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

[英]MySQL Auto Increment Columns on TRANSACTION, COMMIT, and ROLLBACK

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM