程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> 事務回滾後,自增ID仍然增加

事務回滾後,自增ID仍然增加

編輯:DB2教程

回滾後,自增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 個資料列)
*/

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved