Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
 Re: Уникальный номер в течении дня  [new]
-2-
Member

Откуда:
Сообщений: 15330
SY
Stax
я б так не делал


А что смущает?
Табличка в два поля и одну строку и функция nextВал позволит то же самое, но без джобов и регулярных дроп креате.
3 сен 18, 22:20    [21663191]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный номер в течении дня  [new]
SkilledJunior
Member

Откуда:
Сообщений: 303
-2-,

Строка в табличке будет не одна, на каждую дату нужна новая строка. Но самое главное при таком подходе получение номеров возможно только последовательно, пока первый пользователь получивший номер не завершил транзакцию другой не сможет получить номер, может быть именно так и должно быть, а может быть будет приличный затык, поскольку мы не знаем условий задачи.
4 сен 18, 00:51    [21663317]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный номер в течении дня  [new]
Morra
Member

Откуда: Новосибирск
Сообщений: 106
Спасибо большое всем за отзывчивость, не ожидала столько ответов.

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

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

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

Одновременная выдача талончика маловероятна, выдают два оператора активно и два время от времени (всего 4), но вот это случилось.
4 сен 18, 05:20    [21663346]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный номер в течении дня  [new]
Morra
Member

Откуда: Новосибирск
Сообщений: 106
feagor
Morra,

обычный sequence
CREATE SEQUENCE my_seq
 START WITH     1
 INCREMENT BY   1
 MAXVALUE  4000
 CYCLE;


select my_seq.nextval from dual; 


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


Протестировала, всё отлично работает, задвоений нет, под мои условия подходит. Спасибо!
4 сен 18, 06:51    [21663360]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный номер в течении дня  [new]
Elic
Member

Откуда:
Сообщений: 29990
SkilledJunior
Но самое главное при таком подходе получение номеров возможно только последовательно, пока первый пользователь получивший номер не завершил транзакцию другой не сможет получить номер
Ты не слышал про автономные транзакции?
4 сен 18, 07:29    [21663372]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный номер в течении дня  [new]
Elic
Member

Откуда:
Сообщений: 29990
Morra
Протестировала, всё отлично работает, задвоений нет, под мои условия подходит. Спасибо!
Когда-нибудь ты узнаешь, сколько открытий чудных готовит тебе этот быдлокод.
4 сен 18, 07:31    [21663373]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный номер в течении дня  [new]
-2-
Member

Откуда:
Сообщений: 15330
SkilledJunior
поскольку мы не знаем условий задачи
Сколько бы пациент "электронной очереди" не ковырялся в носу, формирование номера это апдейт и коммит в одном флаконе.

SkilledJunior
Строка в табличке будет не одна, на каждую дату нужна новая строка.
Достаточно одной. Несколько строк это те же яйца сиквенсы Соломона, то есть навставлять строк заранее.
Либо разруливать конкурентную вставку самим рабочим процессом. Но тогда вспомогательная таблица не нужна. Такую конкурентную вставку применить к исходной таблице автора. Для этого задать уникальность и повтор по dup_val_on_index.
4 сен 18, 08:24    [21663405]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный номер в течении дня  [new]
Stax
Member

Откуда: Ukraine,Lviv
Сообщений: 2795
SY
Stax
я б так не делал


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

SY.

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

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

.....
stax
4 сен 18, 09:07    [21663428]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный номер в течении дня  [new]
SkilledJunior
Member

Откуда:
Сообщений: 303
[quot Elic]
SkilledJunior
Ты не слышал про автономные транзакции?

Не слышал чтобы они позволяли изменять один и тот же ресурс одновременно двумя сеансами, все равно обработка становится последовательной, а в данном случае транзакции и так короткие.
4 сен 18, 11:51    [21663710]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный номер в течении дня  [new]
SkilledJunior
Member

Откуда:
Сообщений: 303
Stax
я б заводил табличку с дата,...,номер и в автономке палил (выдавал) номера
в нас реально работает очередь, таланчики выдает автоматы(киоски) и возможно менеджер "очереди"
главная задача чтоб было меньше скандалов, почему я жду, а соседа обслужили
stax

Тогда уж лучше по классике, создаем табличку ресурсов, создаем табличку ресурс-дата-номер, для выдачи номера выполняем select ... for update ресурса из таблички ресурсов, запрашиваем для этого ресурса текущий номер, если номер на дату есть то +1 и update, если нет то номер равен 1 и insert.
4 сен 18, 13:07    [21663862]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный номер в течении дня  [new]
Leonid Kudryavtsev
Member

Откуда:
Сообщений: 9254
Табличка vs sequence - тема IMHO такая-же как Windows vs Linux. В OeBS нумераторы (в пределах года) сделаны на сиквенсах AFAIK. Многие жалуются, многие плюются, но кактус вполне съедобный.
4 сен 18, 13:24    [21663903]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный номер в течении дня  [new]
-2-
Member

Откуда:
Сообщений: 15330
SkilledJunior
по классике
Во-первых, селект тут ни на что не влияет, кроме увеличении времени транзакции. Во-вторых, не защищает от дублей. Фактически, это вариант изложенный автором, отягощенный вспомогательным "ресурсом".
4 сен 18, 13:26    [21663912]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный номер в течении дня  [new]
Elic
Member

Откуда:
Сообщений: 29990
SkilledJunior
по классике, создаем табличку ресурсов, создаем табличку ресурс-дата-номер, для выдачи номера выполняем select ... for update ресурса из таблички ресурсов, запрашиваем для этого ресурса текущий номер, если номер на дату есть то +1 и update
Вопрос по Sequence
4 сен 18, 13:40    [21663938]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный номер в течении дня  [new]
SkilledJunior
Member

Откуда:
Сообщений: 303
-2-
SkilledJunior
по классике
Во-первых, селект тут ни на что не влияет, кроме увеличении времени транзакции. Во-вторых, не защищает от дублей. Фактически, это вариант изложенный автором, отягощенный вспомогательным "ресурсом".

for update влияет.

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

Если классический алгоритм для вас "отягощен", то это ваш выбор,
4 сен 18, 13:49    [21663973]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный номер в течении дня  [new]
Lary Denis
Member

Откуда:
Сообщений: 30
21663938


А ведь Элик когда-то улыбался..
4 сен 18, 13:53    [21663982]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный номер в течении дня  [new]
-2-
Member

Откуда:
Сообщений: 15330
SkilledJunior
for update влияет
Возможно я не правильно понял изложение. Алгоритм предполагает две вспомогательные таблицы для эмуляции lock table in exclusive mode целевой таблицы?

SkilledJunior
Гарантию отсутствия дублей даст ограничение в виде уникального индекса
Если бы был уникальный индекс, вопроса про дубли не возникло.
4 сен 18, 13:56    [21663987]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный номер в течении дня  [new]
SkilledJunior
Member

Откуда:
Сообщений: 303
-2-
SkilledJunior
for update влияет
Возможно я не правильно понял изложение. Алгоритм предполагает две вспомогательные таблицы для эмуляции lock table in exclusive mode целевой таблицы?

Да, можно пойти в лоб, заблокировать всю целевую таблицу и найти в ней талончик с максимальным номером на текущую дату, после чего вставить новую запись.

Elic
strelets
Пока решил проблему через поле с текущим номером коробки в таблице товаров.
В данном случае самое правильное решение. Если получать следующий номер при помощи:
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.
4 сен 18, 14:12    [21664024]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный номер в течении дня  [new]
Elic
Member

Откуда:
Сообщений: 29990
SkilledJunior
Так я это и сделал
Нет. Ты увидел фигу.
4 сен 18, 14:32    [21664073]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный номер в течении дня  [new]
Morra
Member

Откуда: Новосибирск
Сообщений: 106
Я вас очень внимательно читаю.
Блокировать целую таблицу для обновления номера проблематично, так как есть ещё 5-6 операторов, которые работают и пишут в таблицу начало и окончание времени работы и номер рабочего места, есть ещё id человека, получившего талон. Таблицу я упростила в начале, так как это было не принципиально. Можно, конечно, разнести на две таблицы, но это надо тогда приложение переписывать, а там много.
А если не блокировать, а делать update, то возможно дублирование, которое я и пытаюсь исключить
5 сен 18, 07:11    [21664966]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный номер в течении дня  [new]
Morra
Member

Откуда: Новосибирск
Сообщений: 106
Там разница в 100 милисекунд, а всё равно, задваивается
5 сен 18, 07:13    [21664967]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный номер в течении дня  [new]
Morra
Member

Откуда: Новосибирск
Сообщений: 106
Про уникальный индекс тоже думала, но в таком случае человек, который пытается вставить запись на эти милисекунды позже, получит ошибку. Лучше, конечно, чем задвоение, но тоже не красиво
5 сен 18, 07:15    [21664969]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный номер в течении дня  [new]
-2-
Member

Откуда:
Сообщений: 15330
Morra
Про уникальный индекс тоже думала, но в таком случае человек, который пытается вставить запись на эти милисекунды позже, получит ошибку.
Я правильно понял, что для получения талона "человек" выполняет insert в sqlplus'е?
5 сен 18, 08:05    [21664986]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный номер в течении дня  [new]
Morra
Member

Откуда: Новосибирск
Сообщений: 106
-2-,

не совсем вас поняла. Через приложение на vb.net insert'ы, но тестирую запросы я в Toad, это вроде SQL/PL
5 сен 18, 08:22    [21665005]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный номер в течении дня  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 51786

Morra
Блокировать целую таблицу для обновления номера проблематично, так как есть ещё 5-6
операторов, которые работают и пишут в таблицу начало и окончание времени работы и номер
рабочего места, есть ещё id человека, получившего талон.

При времени выполнения операции с таблицей в районе 100 миллисекунд, эти 5-6 человек
обработаются за полсекунды. Для Явы такое время реакции в приделах нормы. Так в чём
проблема-то?

Posted via ActualForum NNTP Server 1.5

5 сен 18, 12:32    [21665450]     Ответить | Цитировать Сообщить модератору
 Re: Уникальный номер в течении дня  [new]
SkilledJunior
Member

Откуда:
Сообщений: 303
Создаете таблицу с семафорами 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 из первого поста темы подставляя в него полученный номер.
5 сен 18, 13:35    [21665609]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2] 3   вперед  Ctrl      все
Все форумы / Oracle Ответить