Vadim Mescheryakov wrote:
Получается решение такое:
Во временную таблицу (время жизни до конца транзакции) пишем Id
созданных документов
После завершения процедуры формирования в этой же транзакции выполняем
update номера документа значением полученным из генератора, получается
что единственный вариант пропуска номера – разрыв коннекта в промежутке
между получением номеров их генератора и коммит.
А зачем тут временная таблица?
У документа 2 номера: внутренний IDint и внешний IDext (для юзера),
при создании документа внешний номер остается пустым, если все нормально
создалось, делаем
update Document set IDext = GEN_ID(IDext_gen,1) where IDint = ...;
Вороятность получить документ без внешнего номера - только в случае
потери коннекта перед update. На этот случай можно на старте программы
делать
update Document set IDext = GEN_ID(IDext_gen,1) where IDext is null;
Да! сохраненный документ с присвоенным IDext удалять нельзя - иначе
опять дырка в нумерации.
Как вариант: операцию присвоения номера документу вынести в отдельный
бизнес-процесс, называемый "регистрация документа" или как-то так.