Создание генератора в FireBird
Создание генератора в FireBird
Доброго времени суток.
Мне необходимо реализовать следующую задачу: в БД Firebird заносятся данные для хранения и распечатки пропусков, при этом в одной таблице хранятся данные на транспортные пропуска и пропуска для физических лиц. В пропуске должно присутствовать поле номер, причем нумеруются пропуска каждый день заново, т.е. каждый рабочий день создается пропуск № 1 для транспорта, пропуск №1 для физического лица и т.д.
Вопрос заключается в том, чтобы реализовать генератор для номеров пропусков, который бы не вызывал конфликтов при одновременном занесении данных несколькими пользователями! Как можно грамотно создать такой генератор?
Заранее спасибо!
Мне необходимо реализовать следующую задачу: в БД Firebird заносятся данные для хранения и распечатки пропусков, при этом в одной таблице хранятся данные на транспортные пропуска и пропуска для физических лиц. В пропуске должно присутствовать поле номер, причем нумеруются пропуска каждый день заново, т.е. каждый рабочий день создается пропуск № 1 для транспорта, пропуск №1 для физического лица и т.д.
Вопрос заключается в том, чтобы реализовать генератор для номеров пропусков, который бы не вызывал конфликтов при одновременном занесении данных несколькими пользователями! Как можно грамотно создать такой генератор?
Заранее спасибо!
www.ibase.ru/devinfo/generator.htm
p.s. прежде чем задавать вопрос, рекомендую пользоваться поиском.
p.s. прежде чем задавать вопрос, рекомендую пользоваться поиском.
Re: Создание генератора в FireBird
1- блокировать таблицу например, пока один пропуск заводит, все остальные курят хвоюantonie писал(а):Доброго времени суток.
Мне необходимо реализовать следующую задачу: в БД FireBird заносятся данные для хранения и распечатки пропусков, при этом в одной таблице храняться данные на транспортные пропуска и пропуска для физических лиц. В пропуске должно присутствовать поле номер, причем номеруются пропуска каждый день заново, т.е. каждый рабочий день создается пропуск № 1 для транспорта, пропуск №1 для физического лица и т.д.
Вопрос заключатся в том, чтобы реализовать генератор для номеров пропусков, который бы не вызывал конфликтов при одновременном занесении данных несколькими пользователями! Как можно грамотно создать такой генеротор?
Заранее спасибо!
2- создать уникальный ключ дата+номер, выбирать новый номер по max, проверять наличие дырок - дубликат получит отлуп
3 - ну а без конфликтов, создать уникальный ключ дата+номер, где номер от генератора, который обнуляется ежесуточно
(бездырочность не гарантируется)
Re: Создание генератора в FireBird
Я сделал так, при нажатии в приложении на кнопку "добавить" выполняется запрос на поиск максимального необходимого номера, после чего он либо увеличивается на один, либо выставляется в 1, если это первая добавляемая запись, а потом уже добавляются данные с посчитанным номером. Но при одновременном занесении записей с двух разных станций боюсь запрос номера может дать один результат и тогда два разных пользователся попытаются внести данные с одним номером.stix-s писал(а): 1- блокировать таблицу например, пока один пропуск заводит, все остальные курят хвою :)
2- создать уникальный ключ дата+номер, выбирать новый номер по max, проверять наличие дырок - дубликат получит отлуп
3 - ну а без конфликтов, создать уникальный ключ дата+номер, где номер от генератора, который обнуляется ежесуточно
(бездырочность не гарантируется) :)
При этом желательно, чтобы вся работа выполнялась максимально точно (без отлупов, т.к. пользователи - народ пугливый) и быстро, поскольку занесение даннх критично по времени, поэтому вариант типа пользователь получает отлуп или курит хвою мягко говоря нежелателен. :о)
Уважаемый kdv.kdv писал(а):предупреждаю. когда рекомендуют читать документы, их НАДО ЧИТАТЬ.Я сделал так, при нажатии в приложении на кнопку "добавить" выполняется запрос на поиск максимального
Я прочитал этот документ еще ДО того как написал сообщение в форум, однако я не понял как можно, а точнее как нужно реализовать генерирацию с учетом параметров. Именно в этом и состоит вопрос. В частности: допустим будет 2 генератора - свой для каждого типа пропуска, как правильно реализовать сброс генератора в значение 1 при первом обращении за день, если с базой работает несколько пользователей...
это хорошо, только нет же там никаких "параметров"Я прочитал этот документ еще ДО того как написал сообщение в форум, однако я не понял как можно, а точнее как нужно реализовать генерацию с учетом параметров.
так решение тут только одно, и оно СОВЕРШЕННО очевидно. Если каждый день генерация должна начинаться с 1, значит в какой то момент "начала дня" надо сбрасывать нужные генераторы в 0. И, разумеется, такой сброс должен быть монопольным.как правильно реализовать сброс генератора в значение 1 при первом обращении за день, если с базой работает несколько пользователей...
Например, проверка, если "последняя дата пропуска не сегодняшняя, то сбросить генератор" - не монопольная, т.к. не содержит блокировки общего ресурса и может быть выполнена двумя пользователями (как и инкремент max).
Соответственно - или надо выбирать момент, или придется проверять такое условие каждый раз (что неудобно, добавит тормозов, и т.п.).
Можно, кстати, использовать и метод, который описан в той же статье для монопольного вызова процедур.
а к статье Кукарцева про udf (udf_ok.htm) идет пример udfdemox - с монополизацией через мютексы. Но я бы рекомендовал, если режим работы позволяет, сбрасывать генераторы в начале суток шедулером.
Хотя, надо рассматривать все варианты обломов, и что за этим последует. Например, шедулер не вызовется. И? Или, пропуска начнут выписывать до старта шедулера. И т.п.
Так что может получиться, что без монопольной блокировки какой-нибудь таблицы и не получится...