Создание генератора в FireBird

Модераторы: kdv, CyberMax

Ответить
antonie
Сообщения: 9
Зарегистрирован: 12 дек 2007, 09:37

Создание генератора в FireBird

Сообщение antonie » 03 мар 2008, 10:53

Доброго времени суток.

Мне необходимо реализовать следующую задачу: в БД Firebird заносятся данные для хранения и распечатки пропусков, при этом в одной таблице хранятся данные на транспортные пропуска и пропуска для физических лиц. В пропуске должно присутствовать поле номер, причем нумеруются пропуска каждый день заново, т.е. каждый рабочий день создается пропуск № 1 для транспорта, пропуск №1 для физического лица и т.д.
Вопрос заключается в том, чтобы реализовать генератор для номеров пропусков, который бы не вызывал конфликтов при одновременном занесении данных несколькими пользователями! Как можно грамотно создать такой генератор?

Заранее спасибо!

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 03 мар 2008, 11:14

www.ibase.ru/devinfo/generator.htm

p.s. прежде чем задавать вопрос, рекомендую пользоваться поиском.

stix-s
Заслуженный разработчик
Сообщения: 557
Зарегистрирован: 13 дек 2005, 11:52

Re: Создание генератора в FireBird

Сообщение stix-s » 03 мар 2008, 11:18

antonie писал(а):Доброго времени суток.

Мне необходимо реализовать следующую задачу: в БД FireBird заносятся данные для хранения и распечатки пропусков, при этом в одной таблице храняться данные на транспортные пропуска и пропуска для физических лиц. В пропуске должно присутствовать поле номер, причем номеруются пропуска каждый день заново, т.е. каждый рабочий день создается пропуск № 1 для транспорта, пропуск №1 для физического лица и т.д.
Вопрос заключатся в том, чтобы реализовать генератор для номеров пропусков, который бы не вызывал конфликтов при одновременном занесении данных несколькими пользователями! Как можно грамотно создать такой генеротор?

Заранее спасибо!
1- блокировать таблицу например, пока один пропуск заводит, все остальные курят хвою :)
2- создать уникальный ключ дата+номер, выбирать новый номер по max, проверять наличие дырок - дубликат получит отлуп
3 - ну а без конфликтов, создать уникальный ключ дата+номер, где номер от генератора, который обнуляется ежесуточно
(бездырочность не гарантируется) :)

antonie
Сообщения: 9
Зарегистрирован: 12 дек 2007, 09:37

Re: Создание генератора в FireBird

Сообщение antonie » 03 мар 2008, 11:35

stix-s писал(а): 1- блокировать таблицу например, пока один пропуск заводит, все остальные курят хвою :)
2- создать уникальный ключ дата+номер, выбирать новый номер по max, проверять наличие дырок - дубликат получит отлуп
3 - ну а без конфликтов, создать уникальный ключ дата+номер, где номер от генератора, который обнуляется ежесуточно
(бездырочность не гарантируется) :)
Я сделал так, при нажатии в приложении на кнопку "добавить" выполняется запрос на поиск максимального необходимого номера, после чего он либо увеличивается на один, либо выставляется в 1, если это первая добавляемая запись, а потом уже добавляются данные с посчитанным номером. Но при одновременном занесении записей с двух разных станций боюсь запрос номера может дать один результат и тогда два разных пользователся попытаются внести данные с одним номером.
При этом желательно, чтобы вся работа выполнялась максимально точно (без отлупов, т.к. пользователи - народ пугливый) и быстро, поскольку занесение даннх критично по времени, поэтому вариант типа пользователь получает отлуп или курит хвою мягко говоря нежелателен. :о)

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 03 мар 2008, 11:53

Я сделал так, при нажатии в приложении на кнопку "добавить" выполняется запрос на поиск максимального
предупреждаю. когда рекомендуют читать документы, их НАДО ЧИТАТЬ.

antonie
Сообщения: 9
Зарегистрирован: 12 дек 2007, 09:37

Сообщение antonie » 03 мар 2008, 12:04

kdv писал(а):
Я сделал так, при нажатии в приложении на кнопку "добавить" выполняется запрос на поиск максимального
предупреждаю. когда рекомендуют читать документы, их НАДО ЧИТАТЬ.
Уважаемый kdv.

Я прочитал этот документ еще ДО того как написал сообщение в форум, однако я не понял как можно, а точнее как нужно реализовать генерирацию с учетом параметров. Именно в этом и состоит вопрос. В частности: допустим будет 2 генератора - свой для каждого типа пропуска, как правильно реализовать сброс генератора в значение 1 при первом обращении за день, если с базой работает несколько пользователей...

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Сообщение WildSery » 03 мар 2008, 12:10

У тебя круглосуточная работа?
Если "день" начинается в 7 утра, значит, в 6 запускай шедулером запрос в БД на обнуление генераторов.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 03 мар 2008, 13:26

Я прочитал этот документ еще ДО того как написал сообщение в форум, однако я не понял как можно, а точнее как нужно реализовать генерацию с учетом параметров.
это хорошо, только нет же там никаких "параметров"
как правильно реализовать сброс генератора в значение 1 при первом обращении за день, если с базой работает несколько пользователей...
так решение тут только одно, и оно СОВЕРШЕННО очевидно. Если каждый день генерация должна начинаться с 1, значит в какой то момент "начала дня" надо сбрасывать нужные генераторы в 0. И, разумеется, такой сброс должен быть монопольным.
Например, проверка, если "последняя дата пропуска не сегодняшняя, то сбросить генератор" - не монопольная, т.к. не содержит блокировки общего ресурса и может быть выполнена двумя пользователями (как и инкремент max).
Соответственно - или надо выбирать момент, или придется проверять такое условие каждый раз (что неудобно, добавит тормозов, и т.п.).
Можно, кстати, использовать и метод, который описан в той же статье для монопольного вызова процедур.

а к статье Кукарцева про udf (udf_ok.htm) идет пример udfdemox - с монополизацией через мютексы. Но я бы рекомендовал, если режим работы позволяет, сбрасывать генераторы в начале суток шедулером.
Хотя, надо рассматривать все варианты обломов, и что за этим последует. Например, шедулер не вызовется. И? Или, пропуска начнут выписывать до старта шедулера. И т.п.
Так что может получиться, что без монопольной блокировки какой-нибудь таблицы и не получится...

antonie
Сообщения: 9
Зарегистрирован: 12 дек 2007, 09:37

Сообщение antonie » 03 мар 2008, 13:50

ок, спасибо. буду пробовать :о)

Ответить