2011-12-28 91 views
2

我有一個C#控制檯應用程序正在使用存儲過程將行插入SQL Server數據庫。目前這個數據庫有大約100萬行,但ID列最多隻有26米!無插入SQL Server身份列遞增

在上次成功插入的ID從16米到26米。該應用程序並行運行多個線程,因此有可能試圖在同一時間插入兩件事情。

除了事務回滾之外,是否還有其他事情會導致標識列增加而不添加行?

似乎不太可能有兩次線程試圖在同一時間寫入衝突行的1000萬次。

我使用的是通過傳遞XML到存儲過程填充的臨時表變量:

-- insert data if it doesn-t already exist 
insert into DataStore (DataText, DataSourceID) 
select distinct td.dataText, td.dataSource 
    from @tempData td 
where not exists (select 'x' 
         from DataStore ds 
        where ds.DataText = td.dataText); 
+1

你必須有一個競爭條件。該模式不會在併發下工作[如此處所示](http://stackoverflow.com/questions/3407857/only-inserting-a-row-if-its-not-already-there) – 2011-12-28 11:37:36

+0

「DataText」有一個它的唯一約束?也許你確實遇到過整個負載的回滾。 – 2011-12-28 11:44:08

+0

'DataText'沒有約束,但是另一個列'DateCreated'(默認值爲'getdate()')的確有一個。 – finoutlook 2011-12-28 12:59:02

回答

4

什麼可以留下缺口?

我還檢查使用IDENT_INCR增量值的情況下,它確實是500萬還是這樣

+0

Increment是1,從不在表上做任何刪除。我會看看約束。 – finoutlook 2011-12-28 11:35:39

+1

@finoutlook:增加了更多想法 – gbn 2011-12-28 11:40:28

2

inserted和deleted記錄遞增身份櫃檯, 由@gbn提到的 - 回滾和c-違法行爲還可以,但有兩個選項:

  • SET IDENTITY_INSERT
  • DBCC CHECKIDENT(...,RESEED)
+1

我將DBCC CHECKIDENT添加到我的答案中,忘記了那個。乾杯 – gbn 2011-12-28 12:12:30