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 удалять нельзя - иначе опять дырка в нумерации.

Как вариант: операцию присвоения номера документу вынести в отдельный бизнес-процесс, называемый "регистрация документа" или как-то так.

Ответить