天天看點

事務復原後,自增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

-----------

看以上的例子代碼,如果自增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 ,如需轉載請自行聯系原作者