Пробелы в SQL Server Sequence

У меня есть SEQUENCE которую я использовал для определения фонового списка транзакций таблицы:

 CREATE SEQUENCE [Seq].[Folio] AS [bigint] START WITH 114090 INCREMENT BY 1 MINVALUE -9223372036854775808 MAXVALUE 9223372036854775807 CACHE 

Сегодня только для любопытства я сделал:

 SELECT folio FROM transactions ORDER BY folio DESC 

и что было неожиданностью, что есть пробелы, поэтому в таблице отсутствуют недостающие фолианты.

Пример:

  • 898, 897, 894, 892, 890, 889 …

Это означает, что что-то происходит. Чтобы предоставить больше информации, хранимая процедура INSERT которую я использовал, имеет следующие значения: INSERT INTO...

 DECLARE @numfolio int SELECT @numfolio = NEXT VALUE FOR Seq.Folio 

При сохранении информации из моего приложения я использовал транзакции базы данных, поэтому, если все идет хорошо, приложение выполняет COMMIT TRANSACTION а если нет, то выполняю ROLLBACK TRANSACTION .

Я думаю, что причиной проблемы является транзакция, поэтому, когда есть ошибка, NEXT VALUE последовательности уже сгенерирована, и ROLLBACK не влияет на нее.

Любой ключ, как решить это, чтобы иметь идеальную последовательность без пробелов?

Solutions Collecting From Web of "Пробелы в SQL Server Sequence"

Итак, есть несколько вещей, которые вы должны понимать о последовательности.

  1. Это не транзакционно, так что да, как только транзакция извлекает значение, откат назад не восстанавливает его.
  2. Значения для последовательности выделяются пакетами, поэтому скажите, что у вас установлен размер кеша 10, возьмите одно значение, а затем перезапустите сервер, будет разрыв в 10.

Что касается того, как получить идеальную последовательность, то, скорее всего, единственный способ сделать это – получить максимальное значение из таблицы в сериализуемой транзакции. Теперь вопрос, который вы должны задать себе: «действительно ли они должны быть последовательными?».