Автоинкремент SQL в Oracle APEX иногда пропускает часть чисел при увеличении? - PullRequest
2 голосов
/ 28 сентября 2011

Я создал таблицу в APEX с PK, который увеличивается на последовательность SQL:

CREATE SEQUENCE seq_increment
MINVALUE 1
START WITH 880    
INCREMENT BY 1
CACHE 10

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

Кажется, он переходит к следующему числу «10».то есть вчера мой последний тест назначил 883, а сегодня утром он назначил 890 как следующий номер.Глядя на мой код для создания последовательности, я замечаю, что настроил ее для кэширования 10 значений, чтобы она быстрее обрабатывалась.Возможно ли, что этот кэш сбрасывается за ночь и что он вытягивает 890, потому что в нем было 880-889 кеша, и он был сброшен?

Существуют ли другие потенциальные причины и решения?

Ответы [ 3 ]

5 голосов
/ 28 сентября 2011

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

Скорее всего, CACHE 10 - вот почему вы теряете числа в этом случае.Значение кэша - это количество значений последовательности, которые хранятся в памяти для будущего использования.Перезагрузка очистит кэш и приведет к получению 10 новых значений.Аналогичным образом, если последовательность не используется достаточно долго, текущий набор значений может быть удален из общего пула, что также приведет к извлечению нового набора значений.

Это явно не так в случаеваш экземпляр, но порядковые номера также могут быть потеряны из-за откатов.Откат транзакции, включающей одну или несколько последовательностей, отбрасывает значение (я) последовательности.

5 голосов
/ 28 сентября 2011

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

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

2 голосов
/ 28 сентября 2011

Некоторые порядковые номера устарели из одной из структур в памяти (общий пул, я думаю?).Это ожидаемое поведение для последовательностей.Единственная гарантия, что у вас есть, что они уникальны.Если вам нужно представить последовательности без пропусков, вы должны будете сделать это в отчетное время, используя, например, псевдостолбец rownum.Это сделано сознательно, иначе вам придется сериализовать все вставки, т.е. таблицу блокировок.И даже это не будет работать должным образом, если вставка была отменена!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...