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
不,自动增量机制必须在事务范围之外工作,因为在完成事务之前,另一个用户可能正在插入同一个表.在知道您的交易是否使用您刚刚分配的值之前,其他用户的交易必须能够分配下一个值.
重新评论:如果我可以更清楚地说出来,可以回滚交易范围的任何变化.自动递增计数器不会回滚,因此它不遵守事务的原子性.它也不服从隔离,因为即使您的事务尚未提交,另一个事务也会获得下一个值.
自动增量的工作方式意味着,有时,如果插入一些行然后回滚事务,则使用自动增量分配的值将永远丢失!
但这没关系.主键值必须是唯一的,但它们不需要是连续的.换句话说,它们不是行号,你不应该那样使用它们.所以你永远不需要减少自动增量创建的值.
归档时间: |
|
查看次数: |
7394 次 |
最近记录: |