Последовательность повторного использования


11

У меня есть последовательность, которая генерирует номера для отслеживания объектов в моей системе. Он работал нормально в течение достаточно долгого времени.

На прошлой неделе мы заметили, что это начинает повторно использовать значения.

Кажется, что происходит то, что в разные моменты вечера он будет возвращаться к значению, которое было в предыдущий день. Затем он продолжит генерировать значения с этой точки.

Так, например, я мог бы получить что-то вроде этого:

10112
10113
10114
10115
10116
10117
10118
10113
10114
10115
10116
...

Кажется, что нет никакой картины в том, когда это происходит, длительности между первым использованием и вторым использованием (всего 10 минут или несколько часов) или сколько откатывается назад (всего 1 и целых несколько сотен).

Я думал о запуске трассировки (и все еще могу), но я не думаю, что объект последовательности напрямую изменяется. Я полагаю, что причина в том, что дата изменения имеет несколько дней и указывает на то время, когда мы вручную увеличили значение, чтобы попытаться устранить дубликаты. (И проблема возникла несколько раз с тех пор.)

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

ОБНОВЛЕНИЕ: Чтобы ответить на несколько вопросов в комментариях:

  • @@Version:

    Microsoft SQL Server 2012 (SP1) - 11.0.3000.0 (X64) 19 октября 2012 г. 13:38:57

  • Создать скрипт:

    CREATE SEQUENCE [schemaName].[SequenceName] 
      AS [bigint]
      START WITH 410014104
      INCREMENT BY 1
      MINVALUE 410000000
      MAXVALUE 419999999
      CYCLE 
      CACHE 
    GO
  • У меня нет уникального ограничения (но я планирую его надеть). Однако это поможет мне узнать только тогда, когда я повторно использую значение. Не то, что привело к сбросу значений. Я поставил задание, которое получало бы новое значение каждые 5 минут и сохраняло его. Времена и значения скачков не следуют шаблону.

  • Я проверил журналы событий, чтобы увидеть, есть ли ошибка. Единственное, что происходит, - это: http://support.microsoft.com/kb/2793634 Мы применяем исправление сегодня. Я не думаю, что это связано, но это может быть.

1
Почему в этом столбце нет ограничения PK или Unique? Имея это в виду, это повторное использование будет поймано, и вам не придется пытаться угадать, откуда оно исходит, если только код вашего приложения не поглотит все ошибки ...
Аарон Бертран


Можете ли вы показать определение вашей последовательности? Также вы можете проверить журнал ошибок, чтобы увидеть, произошли ли какие-либо значимые события за ночь (например, отработка отказа, перезапуск службы, проблемы с памятью и т. Д.)?
Аарон Бертран

2
Что такое @@VERSION? Также что-нибудь изменилось об окружающей среде? Есть элемент подключения, сообщающий о чем-то похожем. О.П. там засчитывает его было связано с11.0.3000.0
Мартин Смит

2
Что ж, CYCLE, по сути, говорит SQL Server, что вы можете повторно использовать значения. Я абсолютно не знаю, почему у вас возникла эта проблема, и не знаю, что вы поймете почему (сколько времени вы тратите на выяснение причин, по которым у вас спущенная шина, прежде чем просто заменить ее?). Я по-прежнему думаю, что вам лучше всего ограничиться предотвращением дублирования и отключить кэширование в надежде предотвратить повторное использование.
Аарон Бертран

Ответы:


11

Во-первых, если вам не нужны дубликаты в этом столбце, укажите это явно .

ALTER TABLE dbo.whatever ADD CONSTRAINT uq_that_column UNIQUE (that_column);

(Или вы можете сделать это первичным ключом, или изменить кластерный индекс, или что у вас ...)

В любом случае, выдавать ошибку при создании дубликата гораздо лучше, чем просто слепо вставлять дубликат, с которым вам придется иметь дело позже.

Далее, учтите, что ПОСЛЕДОВАТЕЛЬНОСТЬ - это просто генератор чисел, и по умолчанию она имеет кэш из 50 значений. В зависимости от того, как настроены ваши транзакции и какие другие критические события происходят на сервере, возможно, что SQL Server может «забыть», что он генерирует для вас определенные значения. Извините, но я не знаю точно, какие критерии влияют на воспроизведение этой ошибки. Чтобы обойти это (до тех пор, пока ошибка не будет решена / объяснена ), нужно изменить используемую последовательность NO CYCLEи NO CACHE, например:

ALTER SEQUENCE dbo.mysequence NO CYCLE NO CACHE; 

Обратите внимание, что это NO CACHEможет повлиять на производительность и параллелизм, но поможет устранить пробелы, потерянные блоки и, кто знает, может быть, ваша проблема тоже.

Вы также можете убедиться, что вы используете самый последний пакет обновления и CU. На данный момент я рекомендую SP1 и CU10 с 3437 ; SP2 отсутствует, но все еще существует критическая проблема с онлайн-перестройками, которая может повлиять на вас .


Ну, я не могу сделать резервную копию. Так что, если НИКАКИЙ КЭШ не исправит это, то это то, что я сделаю.
Vaccano

Я думал, что могут быть транзакции, вызывающие это. Но на странице «Последовательность» в MSDN сказано: «Порядковые номера генерируются вне области текущей транзакции. Они используются независимо от того, зафиксирована ли транзакция с использованием порядкового номера или откатана». Поэтому я отказался от своей теории транзакций. Я согласен, что должно быть что-то еще происходит.
Vaccano

Оказывается, достаточно было просто установить его NO CYCLE. (По крайней мере, это не случилось прошлой ночью.) Спасибо за помощь!
Vaccano

1
ИСПРАВЛЕНИЕ: Объект Sequence генерирует повторяющиеся значения последовательности, когда SQL Server 2012 или SQL Server 2014 находится под давлением памяти. Предположим, что вы создаете объект последовательности с включенной опцией CACHE в Microsoft SQL Server 2012 или SQL Server 2014. Когда экземпляр находится под давлением памяти и множество одновременных соединений запрашивают значения последовательности из одного и того же объекта последовательности, могут быть сгенерированы дублированные значения последовательности. Кроме того, ошибка нарушения уникального или первичного ключа (PK) возникает при вставке значения дубликата последовательности в таблицу.
Andomar
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.