|
|
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
Добрый день! Есть электронная очередь, в течении дня номер каждой записи должен быть уникален, следующий присваивается максимальный +1, если запись удалена, её номер больше не используется. Например, я вставляю запись таким запросом: Код: plsql 1. 2. 3. И если я параллельно с коллегой в жабе выполняю этот запрос, 50% записей получают один номер. То есть, если мы жмём кнопку в одну секунду, номер дублируется. Я пробовала вешать триггер на это поле, но ситуация не изменилась. Что посоветуете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2018, 08:33 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
Morra, если версия древняя - sequence в 12 и выше "автономер" ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2018, 08:52 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
Morra, unique constraint ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2018, 08:52 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
Morra, обычный sequence Код: plsql 1. 2. 3. 4. 5. Код: plsql 1. В конце дня джобом прогоняете до последнего значения и на сл.день у вас снова счётчик начинается заново Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2018, 11:27 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
feagorВ конце дняЭто когда конкретно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2018, 11:39 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
MorraЧто посоветуете? Забудь про таблицу, используй пакетную переменную. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2018, 12:58 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovMorraЧто посоветуете? Забудь про таблицу, используй пакетную переменную. В дырочку ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2018, 13:01 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
Elic, есть регламентная процедура, так и називается закрытие дня ps счетчик я б сбрасывал не накруткой, а алтером .... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2018, 13:02 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
MorraИ если я параллельно с коллегой в жабе выполняю этот запрос, 50% записей получают один номер. То есть, если мы жмём кнопку в одну секунду, номер дублируется. Изучайте транзакции. В частности - уровень изоляции SERIZLIZABLE. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2018, 13:22 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakovиспользуй пакетную переменную.Получать нумерацию с 1 в каждой новой сессии несколько хуже, чем дубли при одновременном выполнении. Dimitry SibiryakovИзучайте транзакции. В частности - уровень изоляции SERIZLIZABLE.Не поможет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2018, 13:51 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
Staxесть регламентная процедура, так и називается закрытие дняДумаешь, он тоже кулик и в таком же болоте? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2018, 14:03 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
Morraследующий присваивается максимальный +1 Непрерывность присваиваемых номеров обязательна? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2018, 14:08 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
-2-Dimitry Sibiryakovиспользуй пакетную переменную.Получать нумерацию с 1 в каждой новой сессии несколько хуже, чем дубли при одновременном выполнении. Dimitry SibiryakovИзучайте транзакции. В частности - уровень изоляции SERIZLIZABLE.Не поможет.Может Дмитрия взломали? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2018, 14:17 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
AmKadМожет Дмитрия взломали? Да, первое сентября со мной случилось. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2018, 14:25 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
Staxсчетчик я б сбрасывал не накруткой, а алтером Создаем последовательности SEQ_YYYYMMDD на остаток текущего года. Создаем job который выполнятся раз в год (e.g. 15 Декабря) и создает последовательности SEQ_YYYYMMDD на весь следующий год. В BEFORE INSERT триггере: Код: plsql 1. 2. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2018, 14:46 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
SYStaxсчетчик я б сбрасывал не накруткой, а алтером Создаем последовательности SEQ_YYYYMMDD на остаток текущего года. Создаем job который выполнятся раз в год (e.g. 15 Декабря) и создает последовательности SEQ_YYYYMMDD на весь следующий год. В BEFORE INSERT триггере: Код: plsql 1. 2. SY. я б так не делал ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2018, 18:06 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
SY Код: plsql 1. 2. SY. Без даты значение сиквенса бессмысленно, так что trunc(sysdate) как out нужен ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2018, 18:06 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
Есть очень большое подозрение, что в электронной очереди номера должны выдаваться последовательно без пропусков, sequence не обеспечит непрерывность. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2018, 18:20 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
SkilledJuniorЕсть очень большое подозрение, что в электронной очереди номера должны выдаваться последовательно без пропусков, sequence не обеспечит непрерывность. В реальной очереди "талончики" сложнее ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2018, 18:24 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
SkilledJuniorв электронной очереди номера должны выдаваться последовательно без пропусков Почему? Что плохого случится, если за 58-м номером из автомата вылезет 60-й? И чем это отличается от случая, когда человек нажал кнопку дважды и выбросил 59-й номер в мусорку? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2018, 18:31 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
Dimitry Sibiryakov, Плохого ничего, просто вопрос почему так происходит будет следующим от Morra ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2018, 18:37 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
Так как требуется согласованный конкурентный доступ, то и пользоваться нужно механизмами обеспечивающими такой доступ. Например, select ... for update. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2018, 18:59 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
XMLerБез даты значение сиквенса бессмысленно, так что trunc(sysdate) как out нужен То что я прeдлoжил это номер талонa на cегодня. Естсeственно в таблице должно быть/есть поле с дaтой которое определяет это "cегодня". В соокупности они есть PK и говорят "у вас талон на XXX число и вы номер N" . SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2018, 19:05 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
И кстати, если предусматривается предварительная запись, то job создает для последовательностей SEQ_YYYYMMDD на пeриод предварительной записи и выполняется скажем за месяц до истечения. А триггер: Код: plsql 1. 2. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2018, 19:18 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
Staxя б так не делал А что смущает? SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2018, 19:23 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
SYStaxя б так не делал А что смущает?Табличка в два поля и одну строку и функция nextВал позволит то же самое, но без джобов и регулярных дроп креате. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.09.2018, 22:20 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
-2-, Строка в табличке будет не одна, на каждую дату нужна новая строка. Но самое главное при таком подходе получение номеров возможно только последовательно, пока первый пользователь получивший номер не завершил транзакцию другой не сможет получить номер, может быть именно так и должно быть, а может быть будет приличный затык, поскольку мы не знаем условий задачи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 00:51 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
Спасибо большое всем за отзывчивость, не ожидала столько ответов. Версия оракла 11. Номера должны идти по порядку, так как сотрудники ориентируются на это количество, смотря на экран. Но при этом ничего страшного, если талон отменят, либо человек уйдёт и не станет ждать своей очереди и этот талон просто "пропадёт", наоборот, такой вариант предпочтительнее, чтобы сотрудники не напрягались, когда за 100 вдруг идёт 10. Такое бывает примерно 3-4 талона в день. События "конец дня" нет, есть время работы организации. Не совсем поняла, что предлагается. Чтобы каждый день, например, в 6:00 запускалась работа по сбросу счётчика? Одновременная выдача талончика маловероятна, выдают два оператора активно и два время от времени (всего 4), но вот это случилось. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 05:20 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
feagorMorra, обычный sequence Код: plsql 1. 2. 3. 4. 5. Код: plsql 1. В конце дня джобом прогоняете до последнего значения и на сл.день у вас снова счётчик начинается заново Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. Протестировала, всё отлично работает, задвоений нет, под мои условия подходит. Спасибо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 06:51 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
SkilledJuniorНо самое главное при таком подходе получение номеров возможно только последовательно, пока первый пользователь получивший номер не завершил транзакцию другой не сможет получить номерТы не слышал про автономные транзакции? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 07:29 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
MorraПротестировала, всё отлично работает, задвоений нет, под мои условия подходит. Спасибо!Когда-нибудь ты узнаешь, сколько открытий чудных готовит тебе этот быдлокод. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 07:31 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
SkilledJuniorпоскольку мы не знаем условий задачиСколько бы пациент "электронной очереди" не ковырялся в носу, формирование номера это апдейт и коммит в одном флаконе. SkilledJuniorСтрока в табличке будет не одна, на каждую дату нужна новая строка.Достаточно одной. Несколько строк это те же яйца сиквенсы Соломона, то есть навставлять строк заранее. Либо разруливать конкурентную вставку самим рабочим процессом. Но тогда вспомогательная таблица не нужна. Такую конкурентную вставку применить к исходной таблице автора. Для этого задать уникальность и повтор по dup_val_on_index. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 08:24 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
SYStaxя б так не делал А что смущает? SY. я б заводил табличку с дата,...,номер и в автономке палил (выдавал) номера в нас реально работает очередь, таланчики выдает автоматы(киоски) и возможно менеджер "очереди" главная задача чтоб было меньше скандалов, почему я жду, а соседа обслужили дырки ето обычная практика, два раза нажал кнопку на екране, взял талончик и ушел, не на ту услугу записался, и моя головная боль зажевало термобумагу и тд ..... stax ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 09:07 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
[quot Elic]SkilledJuniorТы не слышал про автономные транзакции? Не слышал чтобы они позволяли изменять один и тот же ресурс одновременно двумя сеансами, все равно обработка становится последовательной, а в данном случае транзакции и так короткие. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 11:51 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
Staxя б заводил табличку с дата,...,номер и в автономке палил (выдавал) номера в нас реально работает очередь, таланчики выдает автоматы(киоски) и возможно менеджер "очереди" главная задача чтоб было меньше скандалов, почему я жду, а соседа обслужили stax Тогда уж лучше по классике, создаем табличку ресурсов, создаем табличку ресурс-дата-номер, для выдачи номера выполняем select ... for update ресурса из таблички ресурсов, запрашиваем для этого ресурса текущий номер, если номер на дату есть то +1 и update, если нет то номер равен 1 и insert. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 13:07 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
Табличка vs sequence - тема IMHO такая-же как Windows vs Linux. В OeBS нумераторы (в пределах года) сделаны на сиквенсах AFAIK. Многие жалуются, многие плюются, но кактус вполне съедобный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 13:24 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
SkilledJuniorпо классикеВо-первых, селект тут ни на что не влияет, кроме увеличении времени транзакции. Во-вторых, не защищает от дублей. Фактически, это вариант изложенный автором, отягощенный вспомогательным "ресурсом". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 13:26 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
SkilledJunior по классике , создаем табличку ресурсов, создаем табличку ресурс-дата-номер, для выдачи номера выполняем select ... for update ресурса из таблички ресурсов, запрашиваем для этого ресурса текущий номер, если номер на дату есть то +1 и update Вопрос по Sequence ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 13:40 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
-2-SkilledJuniorпо классикеВо-первых, селект тут ни на что не влияет, кроме увеличении времени транзакции. Во-вторых, не защищает от дублей. Фактически, это вариант изложенный автором, отягощенный вспомогательным "ресурсом". for update влияет. Гарантию отсутствия дублей даст ограничение в виде уникального индекса, я думал что наличие соответствующих ограничений целостности на таблицах само собой разумеется, ошибся ... Если классический алгоритм для вас "отягощен", то это ваш выбор, ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 13:49 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
SkilledJuniorfor update влияетВозможно я не правильно понял изложение. Алгоритм предполагает две вспомогательные таблицы для эмуляции lock table in exclusive mode целевой таблицы? SkilledJuniorГарантию отсутствия дублей даст ограничение в виде уникального индексаЕсли бы был уникальный индекс, вопроса про дубли не возникло. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 13:56 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
-2-SkilledJuniorfor update влияетВозможно я не правильно понял изложение. Алгоритм предполагает две вспомогательные таблицы для эмуляции lock table in exclusive mode целевой таблицы? Да, можно пойти в лоб, заблокировать всю целевую таблицу и найти в ней талончик с максимальным номером на текущую дату, после чего вставить новую запись. Elic streletsПока решил проблему через поле с текущим номером коробки в таблице товаров.В данном случае самое правильное решение. Если получать следующий номер при помощи: Код: plsql 1. 2. , то ни конфликтов, ни дырок не будет. Будет лишь конкуренция в пределах одного товара, которая при грамотном кодировании сводится до незначительных задержек. К тому же на практике такая конкуренция может быть редкой. Естественно, это будет медленнее последовательностей - се ля ви. Так я это и сделал, только товар в моем случае это комбинация ресурса и даты, и эта комбинация может отсутствовать, т.е. нужен не просто update, а upsert. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 14:12 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
SkilledJuniorТак я это и сделалНет. Ты увидел фигу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2018, 14:32 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
Я вас очень внимательно читаю. Блокировать целую таблицу для обновления номера проблематично, так как есть ещё 5-6 операторов, которые работают и пишут в таблицу начало и окончание времени работы и номер рабочего места, есть ещё id человека, получившего талон. Таблицу я упростила в начале, так как это было не принципиально. Можно, конечно, разнести на две таблицы, но это надо тогда приложение переписывать, а там много. А если не блокировать, а делать update, то возможно дублирование, которое я и пытаюсь исключить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2018, 07:11 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
Там разница в 100 милисекунд, а всё равно, задваивается ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2018, 07:13 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
Про уникальный индекс тоже думала, но в таком случае человек, который пытается вставить запись на эти милисекунды позже, получит ошибку. Лучше, конечно, чем задвоение, но тоже не красиво ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2018, 07:15 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
MorraПро уникальный индекс тоже думала, но в таком случае человек, который пытается вставить запись на эти милисекунды позже, получит ошибку.Я правильно понял, что для получения талона "человек" выполняет insert в sqlplus'е? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2018, 08:05 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
-2-, не совсем вас поняла. Через приложение на vb.net insert'ы, но тестирую запросы я в Toad, это вроде SQL/PL ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2018, 08:22 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
MorraБлокировать целую таблицу для обновления номера проблематично, так как есть ещё 5-6 операторов, которые работают и пишут в таблицу начало и окончание времени работы и номер рабочего места, есть ещё id человека, получившего талон. При времени выполнения операции с таблицей в районе 100 миллисекунд, эти 5-6 человек обработаются за полсекунды. Для Явы такое время реакции в приделах нормы. Так в чём проблема-то? Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2018, 12:32 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
Создаете таблицу с семафорами 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 из первого поста темы подставляя в него полученный номер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2018, 13:35 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
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' и возвращаем в основную транзакцию. - с записями, на которых стоят блокировки ничего не делаем. При данном подходе форма стала многопользовательской и промежуточные значения не терялись. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2018, 15:15 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
Да, ТС нужно добавить в табличку еще поле типа дата и, соответственно в функциях F1 и F2 добавится параметр с типом дата. По умолчанию trunc(sysdate), подозреваю. Но в принципе можно записываться и на будущую дату. Чистить табличку по желанию (хотя чего там чистить - слёзы по нынешним временам). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2018, 15:29 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
witte, ТС-у не критичны пропуски. В твоем варианте возможна ситуация, когда клиент получающий номер получит более ранний чем клиент подошедший до него, не факт что это хорошо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2018, 17:39 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
SkilledJuniorТС-у не критичны пропуски. Я описал более общую задачу с недопущением пропусков, причем акцентировал на этом внимание. SkilledJuniorВ твоем варианте возможна ситуация, когда клиент получающий номер получит более ранний чем клиент подошедший до него, не факт что это хорошо. Если нет нужды печатать неиспользованные номера, то проблема решается убиранием ровно одной строчки из описанного мной алгоритма и модификацией еще одной (причем вторая строчка уже по желанию). Легко понять каких двух. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2018, 19:55 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
witte Я описал более общую задачу с недопущением пропусков Ничего твоя борьба с ветряными мельницами не гарантирует. Да еще из твоего повествования хрен поймешь, что с коллизиями. Например, навставляли сессии несколько строк 1,N. Каждая вернула 1. И дальше что? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2018, 22:50 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
-2-witte Я описал более общую задачу с недопущением пропусков Ничего твоя борьба с ветряными мельницами не гарантирует. Да еще из твоего повествования хрен поймешь, что с коллизиями. Например, навставляли сессии несколько строк 1,N. Каждая вернула 1. И дальше что? О, капитан-нечитатель :-) Почитай внимательней, всё там гарантируется. Более того, работает уже более 10 лет без всяких там "конец дня" для такой тривиальщины. ЗЫ: Ты про автономную транзакцию и блокировки (надеюсь не надо говорить как это проверить?) прочитал? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2018, 23:41 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
-2-Например, навставляли сессии несколько строк 1,N. Каждая вернула 1. Вот чтобы не быть голословным, пример можешь привести, в соответствии с моим алгоритмом как это сделать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 05.09.2018, 23:47 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
witteЕсли нет нужды печатать неиспользованные номера, то проблема решается убиранием ровно одной строчки из описанного мной алгоритма и модификацией еще одной (причем вторая строчка уже по желанию). Легко понять каких двух. 21665609 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2018, 00:03 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
witte-2-Например, навставляли сессии несколько строк 1,N. Каждая вернула 1.Вот чтобы не быть голословным, пример можешь привести, в соответствии с моим алгоритмом как это сделать?Вызвать F2 в нескольких сессиях и действовать по первому пунктуwitte- определяет есть ли записи для текущего OrgID (читай тип очереди для данной задачи), и если нет, то вставляет запись в табличку со значениями OrgID, 1, 'N' и возвращает OrgID + 1 в основную транзакцию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2018, 07:56 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
-2-Вызвать F2 в нескольких сессиях и действовать по первому пункту Да, действительно упустил. Тогда первую запись нужно создавать ручками а не в F2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2018, 10:02 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
SkilledJunior, спасибо. Поизучаю автономные транзакции ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2018, 11:21 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
witte, Теперь понятнее, спасибо :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2018, 11:24 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
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. Что же до "алгоритма" вообще, то он не гарантирует отсутствие дырок, а надеется на их дальнейшее переиспользование. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2018, 11:50 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
witteТогда первую запись нужно создавать ручками а не в F2. Плохое решение, нормальное решение это использование семафора, в твоем случае в качестве семафора можно использовать блокировку строки таблицы в которой OrgID является первичным ключом. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2018, 17:13 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
SkilledJuniorwitteТогда первую запись нужно создавать ручками а не в F2. Плохое решение, нормальное решение это использование семафора, в твоем случае в качестве семафора можно использовать блокировку строки таблицы в которой OrgID является первичным ключом.А запись-семафор не нужно создавать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2018, 18:04 |
|
||
|
Уникальный номер в течении дня
|
|||
|---|---|---|---|
|
#18+
-2-А запись-семафор не нужно создавать? Обычно ресурс уже существует в какой нибудь таблице до того как его начинают планировать, у witte например OrgID явно откуда то берется, т.е. уже существует, у Morra такой таблицы нет, поэтому приходится создавать такую таблицу и вставлять в нее запись, эта запись является метаданными приложения и должна быть включена в скрипт создания объектов БД для приложения. Если не использовать таблицу ресурсов, а сразу в таблицу планирования/счетчик номеров добавить по одной записи на каждую дату, то сколько записей добавлять? На год или на два? А через год что, приложение внезапно перестанет работать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.09.2018, 22:03 |
|
||
|
|

start [/forum/topic.php?all=1&fid=52&tid=1883494]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
184ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
119ms |
get tp. blocked users: |
2ms |
| others: | 233ms |
| total: | 586ms |

| 0 / 0 |
