SQL Server - как обеспечить правильное приращение полей идентификации даже в случае отката

В SQL Server, если транзакция, включающая вставку новой строки, откатывается, число в поле идентификатора пропускается.

Например, если наивысший идентификатор в таблице Foos равен 99, тогда мы пытаемся вставить новую запись Foo, но откатимся назад, тогда идентификатор 100 «израсходован», и следующая строка Foo получит номер 101.

Можно ли каким-либо образом изменить это поведение так, чтобы поля идентичности были последовательными?


person David    schedule 04.04.2011    source источник


Ответы (2)


То, что вам нужно, никогда не будет работать со столбцами идентичности.

Они разработаны специально для того, чтобы «выдать» и забыть, чтобы не вызывать ожидания или взаимоблокировки и т. Д. Это свойство позволяет использовать столбцы IDENTITY в качестве последовательности в высокотранзакционной системе без задержек или узких мест.

Чтобы убедиться, что нет пробелов, это означает, что НЕТ СПОСОБА реализовать систему со 100 вставками в секунду, потому что будет очень длинная очередь, чтобы выяснить, будет ли откат 1-й вставки.

По той же причине обычно не требуется ни такое поведение, ни такая числовая последовательность для таблицы большого объема. Однако для очень редко встречающихся таблиц с одним процессом (таких как номер счета-фактуры по одному процессу в месяц) допустимо размещать транзакцию вокруг MAX(number)+1 или аналогичного запроса, например

declare @next int
update sequence_for_tbl set @next=next=next+1
.. use @next
person RichardTheKiwi    schedule 04.04.2011

Идентификация SQL (autonumber) увеличивается даже при откате транзакции

person demas    schedule 04.04.2011
comment
Конечно, это не лучшая идея, если вы вставляете много данных. - person Neil Knight; 04.04.2011