事务回滚后,自增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,如果需要紧密连续的自增序列,建议采用其他方法生成。

--不連續沒關係,需要時候生成一列
if object_id('tb')is not null drop table tb
go
create table tb(ID int )
insert tb select 1
insert tb select 2
insert tb select 5
insert tb select 18
insert tb select 13
select id ,[newid]=(select count(*) from tb where id<=t.id) from tb t order by [newid]
/*id     newid
----------- -----------
1      1
2      2
5      3
13     4
18     5(影響 5 個資料列)
*/

为什么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计数器也不会作负运算。

mysql事务回滚后,自增ID仍然增加相关推荐

  1. mysql事务回滚是什么意思_Mysql事务提交及事务回滚是什么意思

    本篇文章主要给大家介绍mysql事务提交及事务回滚的相关知识. 事务可以说是一段sql 语句的批处理,但是这个批处理是一个atom(原子) ,不可分割,要么都提交执行,要么回滚(rollback)都不 ...

  2. Mysql事务回滚机制与原理

    Mysql事务回滚机制与原理 文章目录 Mysql事务回滚机制与原理 一.事务回滚机制 二.使用到的技术讨论 三.redo log和undo log介绍 3.1 redo log 3.2 undo l ...

  3. mysql事务 mysql事务回滚 MySQL事务死锁 如何解除死锁 资金出入账

    这里写目录标题 问题 什么是事务 为什么需要事务 创建账户表 插入数据 无事务资金出入账 有事务资金出入账 事务死锁 死锁出现的原因 解决事务死锁 查看表级锁 查询表锁进程 查询行级锁 杀死行锁进程 ...

  4. mysql 事务回滚_简短截说阐述redis中事务的使用

    我们知道,在关系型数据库中,比如mysql,如果要使用事务,首先向数据库服务器发送 BEGIN ,然后执行各个相互一致的写操作和读操作,最后,用户可以选择发送 COMMIT 来确认之前所做的修改,或者 ...

  5. mysql 事务回滚语句_数据库事务回滚语句-sql事务回滚语句是-用于事务回滚的sql语句...

    sql 回滚语句 这种情况的数据恢复只能利用事务日志的备份来进行,所以如果你的SQL没有进行相应的全库备份 或不能备份日志(truncate log on checkpoint选项为1),那幺就无法进 ...

  6. SQL Server事务回滚对自增键的影响

    SQL Server事务回滚时是删除原先插入导致的自增值,也就是回滚之前你你插入一条数据导致自增键加1,回滚之后还是加1的状态 --如果获取当前操作最后插入的identity列的值: select @ ...

  7. mysql 事务 回滚 原理_mysql 事务的实现原理

    一. 开篇 相信大家都用过事务以及了解他的特点,如原子性(Atomicity),一致性(Consistency),隔离型(Isolation)以及持久性(Durability)等.今天想跟大家一起研究 ...

  8. mysql 事务回滚_SQL基础丨事务处理

    事务的特性:ACID MySQL5.5版本之前,默认的存储引擎是MyISAM,在5.5版本之后默认存储引擎是InnoDB.两者唯一的区别就是InnoDB支持事务. 事务的英文是transaction, ...

  9. spring mysql 事务回滚失败_Spring事务回滚失败

    我在Service层里面调用两个Dao层的方法.一个方法用于储存一行Investor数据,一个方法用于储存和有Investor主键的Address数据.service层方法如下,注意Investor继 ...

最新文章

  1. 运行jsp时,报错404
  2. 【Hadoop】Hadoop MR异常处理
  3. getAttribute与getParameter区别
  4. 安装dos2unix
  5. 【剑指offer】21、调整数组顺序使奇数在偶数前面
  6. 贝塞尔曲线 java_贝塞尔曲线理论及实现——Java篇
  7. 单用户修改root密码--centos6.2
  8. python 词云_python词云-数据产品岗位描述的词云
  9. b+树 b-树的区别
  10. Node如何自动重启进程
  11. 懒加载和预加载的区别_类的动态创建(ro,rw)amp; 懒加载类和非懒加载类底层加载的区别 amp; 类和分类的搭配分析...
  12. Linux环境下FFMPEG的安装与配置
  13. 单片机原理及应用c语言编程,单片机原理及应用C语言版.ppt
  14. 1.18 物主代词 形容词 宾语从句
  15. 选股小技巧|如何选股
  16. 如何提升Google排名?
  17. ad如何绘制拼版_Altium Design PCB拼板完整教程,这样讲就明白了!
  18. CSS3 background-size让背景图寸尺大小可控
  19. x265中计算RD Cost的几种方式
  20. 【渝粤教育】国家开放大学2018年春季 0701-21T公共政策学 参考试题

热门文章

  1. [转载] java给对象中的包装类设置默认值
  2. [转载] Python进阶:设计模式之迭代器模式
  3. 编程语言优缺点_R编程语言的优缺点
  4. 操作系统文件分配策略_操作系统中的文件分配方法
  5. pipedreader_Java PipedReader connect()方法与示例
  6. java队列实现限流,java中应对高并发的两种策略
  7. c语言1+2+3+4+5_C程序来计算系列1+(1 + 2)+(1 + 2 + 3)+(1 + 2 + 3 + 4)+ ... +(1 + 2 + 3 + ... + n)...
  8. vb 导出整数 科学计数法_可整数组的计数
  9. python列表中随机选择_如何在Python中从列表中随机选择一个项目?
  10. c 运算符##_C#程序演示关系运算符的示例