powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Уникальный номер в течении дня
16 сообщений из 66, страница 3 из 3
Уникальный номер в течении дня
    #39698562
witte
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevВ OeBS нумераторы (в пределах года) сделаны на сиквенсах AFAIK. Многие жалуются, многие плюются, но кактус вполне съедобный.
Вот, кстати, в OeBS из-за сиквенсов и пришлось подобную задачу автонумерации делать, т.к.:
1. По требованию клиента не должно быть пропусков (это-то как раз несложно, но см. п.2)
2. На форме, которую нужно было кастомизировать приходили эвенты WHEN-NEW-FORM-INSTANCE (где номер и подпихивался) и по срабатыванию нажатия кнопки Ок. Ничего внятного промежуточного, на что можно было бы повесить вызов в CUSTOM.pll, не приходило. Т.е. при стандартной кастомизации форма была _однопользовательской_, что, разумеется, было неприемлимо.

Делается все это через автономные транзакции.
1. Создается табличка вида OrgID, cur_number, is_used (Y/N)
2. По срабатыванию WHEN-NEW-FORM-INSTANCE происходит вызов функции (F1) пакета, которая делает следующее:
- делает вызов, в свою очередь, функции в автономной транзакции (F2), которая возвращает текущий номер
- ставит блокировку на запись с выданными OrgID + cur_number, поменяв is_used с N на Y
Ну а дальше ждем в этой транзакции что пользователю заблагорассудится.
3. Функция в автономной транзакции (F2) делает следующее
- определяет есть ли записи для текущего OrgID (читай тип очереди для данной задачи), и если нет, то вставляет запись в табличку со значениями OrgID, 1, 'N' и возвращает OrgID + 1 в основную транзакцию.
- если есть несколько записей со статусом использования 'Y' и без блокировок на них - удаляем все, кроме той, где максимальное значение cur_number для данного OrgID.
- если записи уже есть, статус использования 'N', то возвращаем эту запись (я брал минимальную, но тут не принципиально) - это те записи где либо стухла основная сессия, либо пользователь решил не сохранять данные на форме.
- если запись со статусом 'Y' уже есть, на ней нет блокировки (к этому моменту она уже одна такая для текущего OrgID), то увеличиваем cur_number на 1, статус is_used ставим в 'N' и возвращаем в основную транзакцию.
- с записями, на которых стоят блокировки ничего не делаем.

При данном подходе форма стала многопользовательской и промежуточные значения не терялись.
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39698575
witte
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, ТС нужно добавить в табличку еще поле типа дата и, соответственно в функциях F1 и F2 добавится параметр с типом дата. По умолчанию trunc(sysdate), подозреваю. Но в принципе можно записываться и на будущую дату.
Чистить табличку по желанию (хотя чего там чистить - слёзы по нынешним временам).
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39698661
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
witte,

ТС-у не критичны пропуски. В твоем варианте возможна ситуация, когда клиент получающий номер получит более ранний чем клиент подошедший до него, не факт что это хорошо.
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39698728
witte
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SkilledJuniorТС-у не критичны пропуски.
Я описал более общую задачу с недопущением пропусков, причем акцентировал на этом внимание.
SkilledJuniorВ твоем варианте возможна ситуация, когда клиент получающий номер получит более ранний чем клиент подошедший до него, не факт что это хорошо.
Если нет нужды печатать неиспользованные номера, то проблема решается убиранием ровно одной строчки из описанного мной алгоритма и модификацией еще одной (причем вторая строчка уже по желанию). Легко понять каких двух.
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39698768
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
witte
Я описал более общую задачу с недопущением пропусков
Ничего твоя борьба с ветряными мельницами не гарантирует. Да еще из твоего повествования хрен поймешь, что с коллизиями. Например, навставляли сессии несколько строк 1,N. Каждая вернула 1. И дальше что?
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39698776
witte
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-witte
Я описал более общую задачу с недопущением пропусков
Ничего твоя борьба с ветряными мельницами не гарантирует. Да еще из твоего повествования хрен поймешь, что с коллизиями. Например, навставляли сессии несколько строк 1,N. Каждая вернула 1. И дальше что?
О, капитан-нечитатель :-)
Почитай внимательней, всё там гарантируется. Более того, работает уже более 10 лет без всяких там "конец дня" для такой тривиальщины.

ЗЫ: Ты про автономную транзакцию и блокировки (надеюсь не надо говорить как это проверить?) прочитал?
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39698777
witte
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-Например, навставляли сессии несколько строк 1,N. Каждая вернула 1.
Вот чтобы не быть голословным, пример можешь привести, в соответствии с моим алгоритмом как это сделать?
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39698781
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
witteЕсли нет нужды печатать неиспользованные номера, то проблема решается убиранием ровно одной строчки из описанного мной алгоритма и модификацией еще одной (причем вторая строчка уже по желанию). Легко понять каких двух.
21665609
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39698819
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
witte-2-Например, навставляли сессии несколько строк 1,N. Каждая вернула 1.Вот чтобы не быть голословным, пример можешь привести, в соответствии с моим алгоритмом как это сделать?Вызвать F2 в нескольких сессиях и действовать по первому пунктуwitte- определяет есть ли записи для текущего OrgID (читай тип очереди для данной задачи), и если нет, то вставляет запись в табличку со значениями OrgID, 1, 'N' и возвращает OrgID + 1 в основную транзакцию.
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39698861
witte
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-Вызвать F2 в нескольких сессиях и действовать по первому пункту
Да, действительно упустил.
Тогда первую запись нужно создавать ручками а не в F2.
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39698901
Morra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SkilledJunior,

спасибо. Поизучаю автономные транзакции
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39698903
Morra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
witte,

Теперь понятнее, спасибо :)
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39698915
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
witte-2-Вызвать F2 в нескольких сессиях и действовать по первому пункту
Да, действительно упустил.
Тогда первую запись нужно создавать ручками а не в F2.Допустим есть одна запись 123Y. Выполняем одновременно:автор- если запись со статусом 'Y' уже есть, на ней нет блокировки (к этому моменту она уже одна такая для текущего OrgID), то увеличиваем cur_number на 1, статус is_used ставим в 'N' и возвращаем в основную транзакцию.Если "нет блокировки" это select for update skip locked, то вторая сессия получает отсутствие строк. Реакция не описана, если вставка новой записи, то к чему добавлять +1?
Если for update без skip locked, то вторая повиснет до завершения первой. После чего получит 124N. Далее апдейт на 125N? Первая мастер-сессия может отказаться от номера 124 и останется дырка.
Если же под "нет блокировки" понимается значение Y, то эта алгоритмическая тавтология приведет к дублированию значения, как и в случае наличия в данных N.

Что же до "алгоритма" вообще, то он не гарантирует отсутствие дырок, а надеется на их дальнейшее переиспользование.
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39699192
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
witteТогда первую запись нужно создавать ручками а не в F2.
Плохое решение, нормальное решение это использование семафора, в твоем случае в качестве семафора можно использовать блокировку строки таблицы в которой OrgID является первичным ключом.
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39699210
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SkilledJuniorwitteТогда первую запись нужно создавать ручками а не в F2.
Плохое решение, нормальное решение это использование семафора, в твоем случае в качестве семафора можно использовать блокировку строки таблицы в которой OrgID является первичным ключом.А запись-семафор не нужно создавать?
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39699270
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-А запись-семафор не нужно создавать?
Обычно ресурс уже существует в какой нибудь таблице до того как его начинают планировать, у witte например OrgID явно откуда то берется, т.е. уже существует, у Morra такой таблицы нет, поэтому приходится создавать такую таблицу и вставлять в нее запись, эта запись является метаданными приложения и должна быть включена в скрипт создания объектов БД для приложения.

Если не использовать таблицу ресурсов, а сразу в таблицу планирования/счетчик номеров добавить по одной записи на каждую дату, то сколько записей добавлять? На год или на два? А через год что, приложение внезапно перестанет работать?
...
Рейтинг: 0 / 0
16 сообщений из 66, страница 3 из 3
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Уникальный номер в течении дня
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]