powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Уникальный номер в течении дня
66 сообщений из 66, показаны все 3 страниц
Уникальный номер в течении дня
    #39696981
Morra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день!
Есть электронная очередь, в течении дня номер каждой записи должен быть уникален, следующий присваивается максимальный +1, если запись удалена, её номер больше не используется.
Например, я вставляю запись таким запросом:
Код: plsql
1.
2.
3.
INSERT INTO TURN (NM_TURN, D_ACT, TITLE) VALUES
 ((select case when max(nm_turn) is null then 1 else max(nm_turn)+1 end from turn
where trunc(d_act) = trunc(sysdate)), sysdate, 'Б') 



И если я параллельно с коллегой в жабе выполняю этот запрос, 50% записей получают один номер. То есть, если мы жмём кнопку в одну секунду, номер дублируется.

Я пробовала вешать триггер на это поле, но ситуация не изменилась.

Что посоветуете?
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39696987
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Morra,

если версия древняя - sequence

в 12 и выше "автономер"

.....
stax
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39696988
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Morra,

unique constraint
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39697078
feagor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Morra,

обычный sequence
Код: plsql
1.
2.
3.
4.
5.
CREATE SEQUENCE my_seq
 START WITH     1
 INCREMENT BY   1
 MAXVALUE  4000
 CYCLE;



Код: plsql
1.
select my_seq.nextval from dual; 



В конце дня джобом прогоняете до последнего значения и на сл.день у вас снова счётчик начинается заново
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
 declare
 i int;
 begin
   loop
   i:= my_seq.nextval;
   exit when i=4000;
   end loop;
 end; 
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39697084
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
feagorВ конце дняЭто когда конкретно?
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39697137
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MorraЧто посоветуете?

Забудь про таблицу, используй пакетную переменную.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39697138
Sheldon Cooper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovMorraЧто посоветуете?

Забудь про таблицу, используй пакетную переменную.

В дырочку
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39697139
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Elic,

есть регламентная процедура, так и називается закрытие дня


ps
счетчик я б сбрасывал не накруткой, а алтером
....
stax
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39697149
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MorraИ если я параллельно с коллегой в жабе выполняю этот запрос, 50% записей получают один
номер. То есть, если мы жмём кнопку в одну секунду, номер дублируется.

Изучайте транзакции. В частности - уровень изоляции SERIZLIZABLE.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39697180
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovиспользуй пакетную переменную.Получать нумерацию с 1 в каждой новой сессии несколько хуже, чем дубли при одновременном выполнении.
Dimitry SibiryakovИзучайте транзакции. В частности - уровень изоляции SERIZLIZABLE.Не поможет.
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39697188
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Staxесть регламентная процедура, так и називается закрытие дняДумаешь, он тоже кулик и в таком же болоте?
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39697194
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Morraследующий присваивается максимальный +1
Непрерывность присваиваемых номеров обязательна?
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39697198
Фотография AmKad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-Dimitry Sibiryakovиспользуй пакетную переменную.Получать нумерацию с 1 в каждой новой сессии несколько хуже, чем дубли при одновременном выполнении.
Dimitry SibiryakovИзучайте транзакции. В частности - уровень изоляции SERIZLIZABLE.Не поможет.Может Дмитрия взломали?
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39697204
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AmKadМожет Дмитрия взломали?

Да, первое сентября со мной случилось.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39697220
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Staxсчетчик я б сбрасывал не накруткой, а алтером


Создаем последовательности SEQ_YYYYMMDD на остаток текущего года. Создаем job который выполнятся раз в год (e.g. 15 Декабря) и создает последовательности SEQ_YYYYMMDD на весь следующий год. В BEFORE INSERT триггере:

Код: plsql
1.
2.
EXECUTE IMMEDIATE TO_CHAR(SYSDATE,'"SELECT SEQ_"YYYYMMDD".NEXTVAL FROM DUAL"')
  INTO :NEW.ID;



SY.
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39697322
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYStaxсчетчик я б сбрасывал не накруткой, а алтером


Создаем последовательности SEQ_YYYYMMDD на остаток текущего года. Создаем job который выполнятся раз в год (e.g. 15 Декабря) и создает последовательности SEQ_YYYYMMDD на весь следующий год. В BEFORE INSERT триггере:

Код: plsql
1.
2.
EXECUTE IMMEDIATE TO_CHAR(SYSDATE,'"SELECT SEQ_"YYYYMMDD".NEXTVAL FROM DUAL"')
  INTO :NEW.ID;



SY.

я б так не делал

.....
stax
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39697323
XMLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SY
Код: plsql
1.
2.
EXECUTE IMMEDIATE TO_CHAR(SYSDATE,'"SELECT SEQ_"YYYYMMDD".NEXTVAL FROM DUAL"')
  INTO :NEW.ID;



SY.

Без даты значение сиквенса бессмысленно, так что trunc(sysdate) как out нужен
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39697327
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть очень большое подозрение, что в электронной очереди номера должны выдаваться последовательно без пропусков, sequence не обеспечит непрерывность.
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39697329
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SkilledJuniorЕсть очень большое подозрение, что в электронной очереди номера должны выдаваться последовательно без пропусков, sequence не обеспечит непрерывность.

В реальной очереди "талончики" сложнее

.....
stax
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39697332
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SkilledJuniorв электронной очереди номера должны выдаваться последовательно без пропусков

Почему? Что плохого случится, если за 58-м номером из автомата вылезет 60-й? И чем это
отличается от случая, когда человек нажал кнопку дважды и выбросил 59-й номер в мусорку?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39697338
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

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

Например, select ... for update.
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39697357
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XMLerБез даты значение сиквенса бессмысленно, так что trunc(sysdate) как out нужен

То что я прeдлoжил это номер талонa на cегодня. Естсeственно в таблице должно быть/есть поле с дaтой которое определяет это "cегодня". В соокупности они есть PK и говорят "у вас талон на XXX число и вы номер N" .

SY.
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39697364
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И кстати, если предусматривается предварительная запись, то job создает для последовательностей SEQ_YYYYMMDD на пeриод предварительной записи и выполняется скажем за месяц до истечения. А триггер:

Код: plsql
1.
2.
EXECUTE IMMEDIATE TO_CHAR(:NEW.APPOINTMENT_DATE,'"SELECT SEQ_"YYYYMMDD".NEXTVAL FROM DUAL"')
  INTO :NEW.ID;



SY.
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39697365
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Staxя б так не делал


А что смущает?

SY.
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39697420
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYStaxя б так не делал


А что смущает?Табличка в два поля и одну строку и функция nextВал позволит то же самое, но без джобов и регулярных дроп креате.
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39697461
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-,

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

Версия оракла 11.

Номера должны идти по порядку, так как сотрудники ориентируются на это количество, смотря на экран. Но при этом ничего страшного, если талон отменят, либо человек уйдёт и не станет ждать своей очереди и этот талон просто "пропадёт", наоборот, такой вариант предпочтительнее, чтобы сотрудники не напрягались, когда за 100 вдруг идёт 10. Такое бывает примерно 3-4 талона в день.

События "конец дня" нет, есть время работы организации. Не совсем поняла, что предлагается. Чтобы каждый день, например, в 6:00 запускалась работа по сбросу счётчика?

Одновременная выдача талончика маловероятна, выдают два оператора активно и два время от времени (всего 4), но вот это случилось.
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39697498
Morra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
feagorMorra,

обычный sequence
Код: plsql
1.
2.
3.
4.
5.
CREATE SEQUENCE my_seq
 START WITH     1
 INCREMENT BY   1
 MAXVALUE  4000
 CYCLE;



Код: plsql
1.
select my_seq.nextval from dual; 



В конце дня джобом прогоняете до последнего значения и на сл.день у вас снова счётчик начинается заново
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
 declare
 i int;
 begin
   loop
   i:= my_seq.nextval;
   exit when i=4000;
   end loop;
 end; 



Протестировала, всё отлично работает, задвоений нет, под мои условия подходит. Спасибо!
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39697507
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SkilledJuniorНо самое главное при таком подходе получение номеров возможно только последовательно, пока первый пользователь получивший номер не завершил транзакцию другой не сможет получить номерТы не слышал про автономные транзакции?
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39697508
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MorraПротестировала, всё отлично работает, задвоений нет, под мои условия подходит. Спасибо!Когда-нибудь ты узнаешь, сколько открытий чудных готовит тебе этот быдлокод.
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39697532
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SkilledJuniorпоскольку мы не знаем условий задачиСколько бы пациент "электронной очереди" не ковырялся в носу, формирование номера это апдейт и коммит в одном флаконе.

SkilledJuniorСтрока в табличке будет не одна, на каждую дату нужна новая строка.Достаточно одной. Несколько строк это те же яйца сиквенсы Соломона, то есть навставлять строк заранее.
Либо разруливать конкурентную вставку самим рабочим процессом. Но тогда вспомогательная таблица не нужна. Такую конкурентную вставку применить к исходной таблице автора. Для этого задать уникальность и повтор по dup_val_on_index.
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39697544
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SYStaxя б так не делал


А что смущает?

SY.
я б заводил табличку с дата,...,номер и в автономке палил (выдавал) номера
в нас реально работает очередь, таланчики выдает автоматы(киоски) и возможно менеджер "очереди"
главная задача чтоб было меньше скандалов, почему я жду, а соседа обслужили

дырки ето обычная практика,
два раза нажал кнопку на екране,
взял талончик и ушел,
не на ту услугу записался,
и моя головная боль зажевало термобумагу и тд

.....
stax
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39697675
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot Elic]SkilledJuniorТы не слышал про автономные транзакции?
Не слышал чтобы они позволяли изменять один и тот же ресурс одновременно двумя сеансами, все равно обработка становится последовательной, а в данном случае транзакции и так короткие.
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39697711
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Staxя б заводил табличку с дата,...,номер и в автономке палил (выдавал) номера
в нас реально работает очередь, таланчики выдает автоматы(киоски) и возможно менеджер "очереди"
главная задача чтоб было меньше скандалов, почему я жду, а соседа обслужили
stax
Тогда уж лучше по классике, создаем табличку ресурсов, создаем табличку ресурс-дата-номер, для выдачи номера выполняем select ... for update ресурса из таблички ресурсов, запрашиваем для этого ресурса текущий номер, если номер на дату есть то +1 и update, если нет то номер равен 1 и insert.
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39697725
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Табличка vs sequence - тема IMHO такая-же как Windows vs Linux. В OeBS нумераторы (в пределах года) сделаны на сиквенсах AFAIK. Многие жалуются, многие плюются, но кактус вполне съедобный.
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39697728
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SkilledJuniorпо классикеВо-первых, селект тут ни на что не влияет, кроме увеличении времени транзакции. Во-вторых, не защищает от дублей. Фактически, это вариант изложенный автором, отягощенный вспомогательным "ресурсом".
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39697743
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SkilledJunior по классике , создаем табличку ресурсов, создаем табличку ресурс-дата-номер, для выдачи номера выполняем select ... for update ресурса из таблички ресурсов, запрашиваем для этого ресурса текущий номер, если номер на дату есть то +1 и update Вопрос по Sequence
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39697762
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-SkilledJuniorпо классикеВо-первых, селект тут ни на что не влияет, кроме увеличении времени транзакции. Во-вторых, не защищает от дублей. Фактически, это вариант изложенный автором, отягощенный вспомогательным "ресурсом".
for update влияет.

Гарантию отсутствия дублей даст ограничение в виде уникального индекса, я думал что наличие соответствующих ограничений целостности на таблицах само собой разумеется, ошибся ...

Если классический алгоритм для вас "отягощен", то это ваш выбор,
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39697768
Lary Denis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
21663938


А ведь Элик когда-то улыбался..
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39697769
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SkilledJuniorfor update влияетВозможно я не правильно понял изложение. Алгоритм предполагает две вспомогательные таблицы для эмуляции lock table in exclusive mode целевой таблицы?

SkilledJuniorГарантию отсутствия дублей даст ограничение в виде уникального индексаЕсли бы был уникальный индекс, вопроса про дубли не возникло.
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39697778
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
-2-SkilledJuniorfor update влияетВозможно я не правильно понял изложение. Алгоритм предполагает две вспомогательные таблицы для эмуляции lock table in exclusive mode целевой таблицы?
Да, можно пойти в лоб, заблокировать всю целевую таблицу и найти в ней талончик с максимальным номером на текущую дату, после чего вставить новую запись.

Elic streletsПока решил проблему через поле с текущим номером коробки в таблице товаров.В данном случае самое правильное решение. Если получать следующий номер при помощи:
Код: plsql
1.
2.
update goods set last_box_id = last_box_id + 1 where goods_id = :GoodsId;
select last_box_id into :BoxId from goods where goods_id = :GoodsId;

, то ни конфликтов, ни дырок не будет. Будет лишь конкуренция в пределах одного товара, которая при грамотном кодировании сводится до незначительных задержек. К тому же на практике такая конкуренция может быть редкой.
Естественно, это будет медленнее последовательностей - се ля ви.
Так я это и сделал, только товар в моем случае это комбинация ресурса и даты, и эта комбинация может отсутствовать, т.е. нужен не просто update, а upsert.
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39697793
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SkilledJuniorТак я это и сделалНет. Ты увидел фигу.
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39698163
Morra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я вас очень внимательно читаю.
Блокировать целую таблицу для обновления номера проблематично, так как есть ещё 5-6 операторов, которые работают и пишут в таблицу начало и окончание времени работы и номер рабочего места, есть ещё id человека, получившего талон. Таблицу я упростила в начале, так как это было не принципиально. Можно, конечно, разнести на две таблицы, но это надо тогда приложение переписывать, а там много.
А если не блокировать, а делать update, то возможно дублирование, которое я и пытаюсь исключить
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39698164
Morra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Там разница в 100 милисекунд, а всё равно, задваивается
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39698166
Morra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про уникальный индекс тоже думала, но в таком случае человек, который пытается вставить запись на эти милисекунды позже, получит ошибку. Лучше, конечно, чем задвоение, но тоже не красиво
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39698175
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MorraПро уникальный индекс тоже думала, но в таком случае человек, который пытается вставить запись на эти милисекунды позже, получит ошибку.Я правильно понял, что для получения талона "человек" выполняет insert в sqlplus'е?
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39698182
Morra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
-2-,

не совсем вас поняла. Через приложение на vb.net insert'ы, но тестирую запросы я в Toad, это вроде SQL/PL
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39698373
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MorraБлокировать целую таблицу для обновления номера проблематично, так как есть ещё 5-6
операторов, которые работают и пишут в таблицу начало и окончание времени работы и номер
рабочего места, есть ещё id человека, получившего талон.

При времени выполнения операции с таблицей в районе 100 миллисекунд, эти 5-6 человек
обработаются за полсекунды. Для Явы такое время реакции в приделах нормы. Так в чём
проблема-то?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #39698451
SkilledJunior
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Создаете таблицу с семафорами eq_resources с полем res_name, в таблицу вставляется одна запись со значением TURN, создаете вторую таблицу eq_numbers с полями res_name, d_act, nm_turn, на нее вешаем внешний ключ на eq_resources поле res_name и ограничение уникальности по полям res_name, d_act. Таким образом последний выданный на определенный день номер будет храниться в поле nm_turn.

Далее пишите хранимую процедуру выдачи номера, чтобы долго не держать семафор занятым процедура должна выполняться как автономная транзакция:
1. Захватываем семафор select ... from eq_resources where res_name = 'TURN' FOR UPDATE
2. Находим последний выданный номер в таблице eq_numbers
3. Если номер найден то номер+1 и update таблицы eq_numbers, если не найден то номер равен 1 и insert в eq_numbers
4. Возвращаем в вызывающую программу новый выданный номер.

В вызывающей программе сначала получаем новый номер, потом выполняется insert из первого поста темы подставляя в него полученный номер.
...
Рейтинг: 0 / 0
Уникальный номер в течении дня
    #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
66 сообщений из 66, показаны все 3 страниц
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Уникальный номер в течении дня
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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