2011-12-28 64 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