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


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.