永发信息网

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

答案:2  悬赏:10  手机版
解决时间 2021-03-01 14:34
为什么mysql事务回滚后,自增ID依然自增
最佳答案
因为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计数器也不会作负运算。
全部回答
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进程来进行回收。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
郇都律师事务所在什么地方啊,我要过去处理事
选择服装的时候,你都考虑哪些因素?
游戏王D-力量的效果是什么?
古溪镇宣传文化中心在哪里啊,我有事要去这个
股票中的点位是什么意思
蜜丝佛陀经典水润粉底霜40和45哪个号好看
山海关,人山人海,观山海的下联是什么
渣配置怎么才能玩LOL流畅点
甲、乙两个班共有学生106人,从甲班选出七分之
苏泊尔电压力锅故障
理想午托晚托全托地址在哪,我要去那里办事
天翼宽带无法连接怎么办
变化叫做物理变化; 变化叫做化学变化又叫做
百世汇通到乡镇吗
金大门业宜州专卖店在什么地方啊,我要过去处
推荐资讯
求歌名歌词:不能说你对不能说我错恩恩怨怨---
BlackDeity译成中文什么意思
如何写总经理工作手册读后感
电脑开机出现红三角
CC英雄联盟自定义皮肤管理器 怎么删除皮肤啊
上面一个山下面一个米是什么字?
长期卧床病人总发烧怎么办
房地产项目的盈亏平衡分析有临界点分析和保本
欣悦龙虾这个地址在什么地方,我要处理点事
从广州火车站到高州火车站需要几个小时呢?单
谁知道lovely friends only 这句英语的意思
买一台单反相机大概需要多少钱?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?