У меня есть консольное приложение C#, которое использует хранимую процедуру для вставки строк в базу данных SQL Server. В настоящее время база данных содержит около 1 м строк, однако столбец идентификаторов находится в 26 м!Идентификационный столбец SQL Server, увеличивающий без вставки
На последней успешной вставке идентификатор прошел от 16 до 26 м. Приложение запускает несколько потоков параллельно, поэтому есть вероятность, что он может одновременно вставлять две вещи.
Есть ли что-либо помимо отката транзакции, который приведет к увеличению столбца идентификации без добавления строки?
Кажется маловероятным, что было 10 миллионов раз, когда два потока пытались написать противоречивую строку одновременно.
Я использую временную табличную переменную, которая заполняется путем передачи 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);
у вас есть состояние гонки там. Этот шаблон не будет работать при параллелизме [как показано здесь] (http://stackoverflow.com/questions/3407857/only-inserting-a-row-if-its-not-already-there) –
Имеет ли 'DataText' уникальное ограничение на него? Возможно, вы действительно столкнулись со всей нагрузкой откатов. –
'DataText' не имеет ограничения, но другой столбец' DateCreated' (заполненный значением по умолчанию 'getdate()') имеет его. – finoutlook