powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Уникальный номер в течении дня
25 сообщений из 66, страница 2 из 3
Уникальный номер в течении дня
    #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
25 сообщений из 66, страница 2 из 3
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Уникальный номер в течении дня
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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