• 为什么mysql事务回滚后, 自增ID依然自增


    事务回滚后,自增ID仍然增加,回滚后,自增ID仍然增加。
    比如当前ID是7,插入一条数据后,又回滚了。然后你再插入一条数据,此时插入成功,这时候你的ID不是8,而是9。因为虽然你之前插入回滚,但是ID还是自增了。

    如果你认为自增ID不应该被事务化,那么其他事务不得不等待着,检查自增ID是被使用还是被回滚,这就导致阻塞。

    比如下面的例子,A表使用自增ID。

    User 1
    ------------
    begin transaction
    insert into A ...
    insert into B ...
    update C ...
    insert into D ...
    commit
    User 2
    -----------
    begin transaction
    insert into A ...
    insert into B ...
    commit

    看以上的例子代码,如果自增ID也要被事务化,那么假设user 2 的事务在user 1执行后的1毫秒后执行,那么他的插入到A表不得不等待User 1的整个事务结束,检查第一个自增ID是不是被使用了,这就导致阻塞。

    自增ID不被事务化是设计使然,不是bug,如果需要紧密连续的自增序列,建议采用其他方法生成。

    mysql事务回滚数据回滚用法与问题
    mysql事务回滚就是BEGIN,ROLLBACK,COMMIT三种组成了,差不就是就如果所有数据提交成功再把数据提交,否则就自动回滚数据了,这种做法多做于银行,种大大型数据操作应用上。

    在当前事务中确实能看到插入的记录。最后只不过删除了。但是AUTO_INCREMENT不会应删除而改变值。

    1、为什么auto_increament没有回滚?

    因为innodb的auto_increament的计数器记录的当前值是保存在存内 存中的,并不是存在于磁盘上,当mysql server处于运行的时候,这个计数值只会随着insert改增长,不会随着delete而减少。而当mysql server启动时,当我们需要去查询auto_increment计数值时,mysql便会自动执行:SELECT MAX(id) FROM 表名 FOR UPDATE;语句来获得当前auto_increment列的最大值,然后将这个值放到auto_increment计数器中。所以就算 Rollback MySQL的auto_increament计数器也不会作负运算。

    2、MySQL的事务对表操作的时候是否是物理操作?

    MySQL的事务是有redo和undo的,redo操作的所有信息都是记录到 redo_log中,也就是说当一个事务做commit操作时,需要先把这个事务的操作写到redo_log中,然后再把这些操作flush到磁盘上,当 出现故障时,只需要读取redo_log,然后再重新flush到磁盘就行了。
    而对于undo就比较麻烦,MySQL在处理事务时,会在数据共享 表空间里申请一个段叫做segment段,用保存undo信息,当在处理rollback,不是完完全全的物理undo,而是逻辑undo,就是说会对之 前的操作进行反操作,但是这些共享表空间是不进行回收的。这些表空间的回收需要由mysql的master thread进程来进行回收。

    参考:

    mysql事务回滚数据回滚用法与问题  http://www.111cn.net/database/mysql/53781.htm

    事务回滚后,自增ID仍然增加 http://www.2cto.com/database/201107/96110.html

    转自:https://blog.csdn.net/guyue35/article/details/53884073

  • 相关阅读:
    跑Linux内存占用率的shell脚本
    Mysql数据导入导出功能(设置及使用)
    Python刷CSDN阅读数(仅供娱乐)
    SSH、SCP命令及使用说明
    2020.6.7 时间记录
    3年经验,中级Java开发招聘信息
    中级Java程序员要求
    提升自身内部核心竞争力要素
    三级联动页面
    大公司和小公司程序员
  • 原文地址:https://www.cnblogs.com/rxbook/p/10742665.html
Copyright © 2020-2023  润新知