Последовательность Oracle не увеличивается должным образом в приложении гибернации - PullRequest
0 голосов
/ 15 мая 2018

У меня есть требование, когда приложение связано со схемой (скажем, A), а схема A имеет разрешение на доступ к таблице другой схемы (скажем, B). Когда я пытаюсь вставить запись через приложение в кластерной среде в схеме B, последовательность не работает должным образом. он имеет приращение с единицей, определенной в последовательности, но иногда он генерирует высокое значение во второй или третьей вставке, а иногда он генерирует меньшее значение при 5-й или 6-й вставке времени.

Но когда я изменил последовательность и получил опцию NO Cache, то все работает нормально. Но это решение дает мне проблему с накладными расходами.

1 Ответ

0 голосов
/ 15 мая 2018

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

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

Давайтепредположим следующую последовательность:

CREATE SEQUENCE test_seq
      INCREMENT BY 1
      START WITH 1
      NOMAXVALUE
      NOCYCLE
      CACHE 10;

Сессия 1 вызывает test_seq.nextval и получает номера от 1 до 10

Сессия 2 вызывает test.seq.nextval и получает номера от 11 до 20

Сессия 1 вставляет три записи

Сессия 2 вставляет две записи

Сессия 1 вставляет одну запись

Результирующий порядок вставки будет

1
2
3
11
12
4

Есливам нужен идентификатор записи, соответствующий порядку вставки, который вы можете использовать в столбце идентификаторов, начиная с Oracle 12c. В общем случае лучше не назначать никакого особого значения столбцу первичного ключа, и лучше отслеживать порядок вставки через столбец отметки времени.

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