|
|
|
Выдача уникальных номеров из ограниченного списка и по кругу.
|
|||
|---|---|---|---|
|
#18+
Добрый день(вечер,утро). Подскажите, пожалуйста, как сделать следующее: Есть задача создавать некие элементы конфигурации. Количество этих элементов ограничено, допустим от 1 до 500. Т.е. когда приложение создает элемент конфигурации, то оно должно в БД записать индекс этого элемента (1..500). Индекс элемента не должен повторяться с другими элементами, при этом запись элемента можно пометить на удаление и тогда можно создать еще один элемент с таким же индексом (другая запись с таким же числом, т.е. уникальность поля очень не желательно использовать). Еще одно условие, что все выдаваемые значения индексов должны увеличиваться, и только когда достигнут верхней границы снова переходят по кругу к 1. Естественно, занятые индексы использовать нельзя. Если свободных нет, то просто сообщение об ошибке. Свободным считается или индекс помеченный на удаление или отсутствующий в таблице с элементами конфигурации. Я сделал, так. Есть табличка, в которой сохраняется текущее значение последнего выданного индекса для конкретного типа элемента. Приложение считывает этот индекс и начинает проверять следующие индексы до конца и один раз по кругу на предмет свободны ли они или нет. Если нашли, то обновляем таблицу выданных значений. Для однопользовательской версии все работает. Но вот, думаю, что такой подход в корне неправильный при многопользовательской работе, только вот как правильно сделать пока не придумал. Нужно, чтобы в многопользовательском режиме разные пользователи могли создавать элементы конфигурации и индексы этих элементов не пересекались. Подскажите как можно поступить в данном случае. P.S. БД - Firebird 2.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2015, 16:53 |
|
||
|
Выдача уникальных номеров из ограниченного списка и по кругу.
|
|||
|---|---|---|---|
|
#18+
vladgulПодскажите как можно поступить в данном случае. Транзакцией, которая будет всё это делать ставишь лок на запись на таблицу выданных значений и работа механизма сводится к однопользовательской. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2015, 17:12 |
|
||
|
Выдача уникальных номеров из ограниченного списка и по кругу.
|
|||
|---|---|---|---|
|
#18+
vladgul, Модуль получения очередного индекса автономный, возможно резидентный, на вход старый индекс + еще чего, на выходе новый индекс... обслуживает очередь... Можно попробовать организовать через таблицу: - ид (счетчик) - старый индекс - новый индекс - признак (0 - не обработан, 1- обработан) Клиентское приложение создаёт новую запись и запоминает ид Модуль анализирует признаки с нулем от начала, пишет новые индексы и меняет признаки на 1 Клиент ждет пока у ид ноль не изменится на 1 и забирает новый индекс Если есть возможность использования триггеров на сервере БД, то можно сделать еще проще, но имхо без резидента и очереди уйти от перехлестов будет трудновато... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2015, 17:29 |
|
||
|
Выдача уникальных номеров из ограниченного списка и по кругу.
|
|||
|---|---|---|---|
|
#18+
Еще сразу не сказал, что после того как пользователь добавляет новый элемент у него транзакция открыта до тех пор, пока он не кликнет по кнопке "Сохранить" (читай commit). Также есть возможность все откатить. Так сделано, потому что пользователь может изменить сразу несколько записей (Multiselect) в таблице и у него должна быть возможность отменить изменения. Dimitry SibiryakovvladgulПодскажите как можно поступить в данном случае. Транзакцией, которая будет всё это делать ставишь лок на запись на таблицу выданных значений и работа механизма сводится к однопользовательской. Все дело в том, что нужно реализовать именно многопользовательский режим работы. Т.к. насколько я понял, в предложенном варианте, пока пользователь на подтвердит изменения все остальные не смогут выполнять аналогичные действия. vmagvladgul, Модуль получения очередного индекса автономный, возможно резидентный, на вход старый индекс + еще чего, на выходе новый индекс... обслуживает очередь... Не совсем понял, резидентный модуль это что? процедура на стороне сервера, которая выполняется все время? Тут моих знаний не хватает. Или это вообще отдельное приложение, которое именно этим и занимается (т.е. по факту еще один клиент БД)? vmagМожно попробовать организовать через таблицу: - ид (счетчик) - старый индекс - новый индекс - признак (0 - не обработан, 1- обработан) Клиентское приложение создаёт новую запись и запоминает ид Модуль анализирует признаки с нулем от начала, пишет новые индексы и меняет признаки на 1 Клиент ждет пока у ид ноль не изменится на 1 и забирает новый индекс Если есть возможность использования триггеров на сервере БД, то можно сделать еще проще, но имхо без резидента и очереди уйти от перехлестов будет трудновато... Также, не уловил идею. Допустим, приложение определило какой в текущий момент времени индекс свободен и записывает его в "старый индекс". Затем, "что-то монопольное со стороны БД" проходит таблицу и подтверждает первую запись с таким индексом, если встречает такой же дублированный номер, то ищет следующий свободный индекс и подтверждает его. Не нашла, также в "признак" - 2 А как с триггерами? На какие события? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.12.2015, 18:31 |
|
||
|
Выдача уникальных номеров из ограниченного списка и по кругу.
|
|||
|---|---|---|---|
|
#18+
vladgul, vladgul... 1. Табличка Элементов Конфигураций (ITEMS): id - первичный ключ ... idxs_id - ссылка на id записи таблицы индексов. Значение должно быть not null. 2. Табличка Индексов (IDXS) со списком всех индексов: 500 записей. id - первичный ключ Index_Value - символическое имя индекса (например, номер от 1 до 500). items_id - ссылка на id записи таблицы Элементов конфигураций. Допустимо значение null. (id и index_value могут быть одним полем) ~~~~~~~~~~~ Таким образом, каждый индекс может ссылаться только на один элемент конфигурации. А каждый элемент конфигурации может ссылаться на один и более индексов. Выборка всех items: select * from items join idxs on items.idxs_id = idxs.id Если в выборке items.id == idxs.items_id, => это рабочий элемент, иначе считаем, что он помечен на удаление. Выборка очередного незанятого индекса - по признаку idxs.items_id is null. В цикле, пока либо не останется незанятых индексов, либо пока попытка записи (insert item+update idxs) не завершится с успехом. ~~~~~~~~~~~ crate items и update idxs - лучше производить в одной транзакции, иначе может оказаться ситуация, когда только что созданный item будет переведен в разряд "помечен на удаление". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2015, 14:22 |
|
||
|
Выдача уникальных номеров из ограниченного списка и по кругу.
|
|||
|---|---|---|---|
|
#18+
vladgulЕще сразу не сказал, что после того как пользователь добавляет новый элемент у него транзакция открыта до тех пор, пока он не кликнет по кнопке "Сохранить" (читай commit). Также есть возможность все откатить. Так сделано, потому что пользователь может изменить сразу несколько записей (Multiselect) в таблице и у него должна быть возможность отменить изменения. Ну так ничего не мешает при нажатии на кнопку "Сохранить" стартовать ещё одну транзакцию с нужными параметрами, получить номера, а потом присвоить их. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.12.2015, 14:26 |
|
||
|
Выдача уникальных номеров из ограниченного списка и по кругу.
|
|||
|---|---|---|---|
|
#18+
Привет vladgul Не очень понятно конечное использование данного механизма, когда код занят записью помеченной на удаление - что видит конечный пользователь? vladgulИндекс элемента не должен повторяться с другими элементами, при этом запись элемента можно пометить на удаление и как много записей типа: код=250, удалить=да могут существовать в таблице? почему сразу не удалить? или к примеру не переместить в архивную таблицу для дальнейших разборов полетов? vladgulЕще одно условие, что все выдаваемые значения индексов должны увеличиваться, и только когда достигнут верхней границы снова переходят по кругу к 1. Естественно, занятые индексы использовать нельзя. Если свободных нет, то просто сообщение об ошибке. Ну как бы это не сложная задача, обычный счетчик, из которого выделяется остаток от деления на 500 и увеличивать его пока выдается ошибка использования - "данный код присутствует". vladgulПодскажите как можно поступить в данном случае. 1. Удалять все записи сразу,а не помечать их на удаление, на крайний случай переносить записи в архив 2. использовать обычный генератор, но значение брать в виде остатка от деления на 500, чтобы алгоритм не был бесконечным, запоминается начальное значение и если снова получаем его - то все занято 3. описать что именно должен получить конечный пользователь и почему (хоть приблизительно :) ) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.01.2016, 11:23 |
|
||
|
|

start [/forum/topic.php?fid=32&fpage=17&tid=1540401]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
36ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
44ms |
get tp. blocked users: |
2ms |
| others: | 10ms |
| total: | 131ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...