微信搜索superit|邀请体验:大数据, 数据管理、OLAP分析与可视化平台 | 赞助作者:赞助作者

事务回滚后,自增ID仍然增加(就是设计成这样,除非自己设计自增id)

jdbc aide_941 78℃

事务回滚后,自增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 個資料列)
*/
本文出自 “一只博客” 博客,请务必保留此出处http://cnn237111.blog.51cto.com/2359144/607957

转载请注明:SuperIT » 事务回滚后,自增ID仍然增加(就是设计成这样,除非自己设计自增id)

喜欢 (0)or分享 (0)