博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
事务回滚后,自增ID仍然增加。
阅读量:6339 次
发布时间:2019-06-22

本文共 935 字,大约阅读时间需要 3 分钟。

回滚后,自增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 個資料列)

*/

本文转自cnn23711151CTO博客,原文链接:http://blog.51cto.com/cnn237111/607957 ,如需转载请自行联系原作者

你可能感兴趣的文章
curl常用选项详解
查看>>
js中的json对象和字符串之间的转化
查看>>
【番外篇】ASP.NET MVC快速入门之免费jQuery控件库(MVC5+EF6)
查看>>
python小细节
查看>>
苹果iOS强制HTTPS迫在眉睫,距离2017年只剩1天,准备好了么?
查看>>
Mybatis源码分析之SqlSessionFactory(一)
查看>>
Python学习--08函数式编程
查看>>
初步了解php,实现注册及登录
查看>>
php的静态化
查看>>
asp.net获取请求的协议头是否启动了SSL(Https)
查看>>
编程书籍阅读随谈(第二篇)
查看>>
HAProxy负载均衡原理及企业级实例部署haproxy集群
查看>>
Java自动装箱和拆箱
查看>>
Atitit gui控件定位解决方案
查看>>
PCL点云变换与移除NaN
查看>>
go实例之函数
查看>>
MyBatis+MySQL 返回插入的主键ID
查看>>
CentOS下搭建wordpress全流程
查看>>
dnf命令 (常用总结)
查看>>
Nginx配置文件nginx.conf中文详解(转)
查看>>