Пробелы появляются, если транзакция использует порядковый номер, но затем откатывается.
Возможно, ответ заключается в том, чтобы не назначать номер счета-фактуры до тех пор, пока счет-фактуру нельзя будет отменить. Это сводит к минимуму (но, вероятно, не устраняет) возможность возникновения пробелов.
Я не уверен, что есть какой-либо быстрый или простой способ гарантировать отсутствие пробелов в последовательности - сканирование MAX, добавление одного и вставка, вероятно, наиболее близкая к безопасности, но не рекомендуется из соображений производительности (и трудностей с параллелизмом). ), и этот метод не обнаружит, если последний номер счета-фактуры был назначен, а затем удален и переназначен.
Можете ли вы каким-то образом объяснить пробелы — определив, какие номера счетов-фактур были «использованы», но каким-то образом «не стали постоянными»? Может ли автономная транзакция помочь в этом?
Другая возможность - предполагая, что разрывы относительно немногочисленны и далеко друг от друга.
Создайте таблицу, в которую записываются порядковые номера, которые необходимо повторно использовать, прежде чем будет получено новое значение последовательности. Обычно она была бы пустой, но какой-то процесс, который запускается каждую... минуту, час, день... проверяет наличие пробелов и вставляет в эту таблицу пропущенные значения. Все процессы сначала проверяют таблицу пропущенных значений и, если они есть, используют значение оттуда, выполняя медленный процесс обновления таблицы и удаления строки, которую они используют. Если таблица пуста, возьмите следующий порядковый номер.
Не очень приятно, но отделение «выставления номеров счетов» от «сканирования пропущенных значений» означает, что даже если процесс выставления счетов завершится ошибкой для какого-либо потока, когда он использует одно из пропущенных значений, это значение будет повторно обнаружено как отсутствующее и повторно переиздается в следующий раз - повторяется до тех пор, пока какой-либо процесс не завершится успехом.
person
Jonathan Leffler
schedule
31.12.2009
NOCACHE
наCREATE SEQUENCE
? Это должно устранить пробелы. - person skaffman   schedule 31.12.2009NOCACHE
указывает, сколько значений последовательности будет храниться в памяти для более быстрого доступа: techonthenet. com/oracle/sequences.php - person OMG Ponies   schedule 31.12.2009