SQL Server - как обеспечить правильное приращение полей идентичности даже в случае отката - PullRequest
3 голосов
/ 04 апреля 2011

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

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

Есть ли способ изменить это поведение, чтобы поля идентичности гарантированно были последовательными?

Ответы [ 2 ]

7 голосов
/ 04 апреля 2011

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

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

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

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

declare @next int
update sequence_for_tbl set @next=next=next+1
.. use @next
...