Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.02.27;
Скачать: CL | DM;

Вниз

Нумерация документов   Найти похожие ветки 

 
Petr V. Abramov ©   (2005-01-28 18:47) [40]

Если нужна нумерация уникальная и "без дырок" - без пропуска номеров, тогда
 заводим табличку из одной записи с одним полем last_num,
update ... set last_num = last_num + 1, читаем и сразу commit
 Другого способа нет, или "дырки" будут, или потенциальное нарушение уникальности


 
Anatoly Podgoretsky ©   (2005-01-28 20:14) [41]

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


 
Sergey_Masloff   (2005-01-30 11:04) [42]

Petr V. Abramov ©   (28.01.05 18:47) [40]
>Если нужна нумерация уникальная и "без дырок" - без пропуска >номеров, тогда
> заводим табличку из одной записи с одним полем last_num,
>update ... set last_num = last_num + 1, читаем и сразу commit
А потом юзер думае - а на фиг этот документ. Я его и заводить не буду. И получаем в базе огрызок у которого есть только номер (да и его сохранить не удастся)

> Другого способа нет, или "дырки" будут, или потенциальное >нарушение уникальности
Ну не знаю. Я когда-то сделал так:
1)есть таблица-буфер (кэш, как угодно назови) c полями типа номер, дата резервирования, кто резервировал.
2) Когда пользователь создает новый документ  (пока у себя - записи в базу нет) процедура берет новый номер генератора и создает запись в буфере - вася пупкин зарезервировал номер 10 в 9:30 18 января. Коммитим.
3) Пользователь работает с документом. Потом 3 варианта
 - все нормально документ пишем в базу. При этом из буфера ранее зарезервированый номер удаляем все в порядке.
 - все плохо документ дискардим. В буфере номер помечаем как свободный.
 - выключили свет все накрылось. Ничего не далаем да и не можем.

4) Создается новый документ. Перед тем как генерировать новый документ сначала лезем не к генератору а в буфер и ищем там первый номер который а) помечен как свободный (последствие отмены документа) б) зарезервирован более суток (восьми часов, двух часов - настраивается - плод вырубона электричества или снятия клиента по Ctrl-Alt-Del). У этого номера изменяется дата резервирования - дальше см. выше. Если в буфере - кеше записей нет то генерируем новую запись вставляем ее в буфер на кону мочло начинай сначала.

Вся эта петрушка была сделана в моем первом самостоятельном проекте работает уже 8 лет из них 6 лет без моего участия. Сбоев нет все нумеруется.


 
Danilka ©   (2005-01-30 13:58) [43]

Как тут весело.

[42] Sergey_Masloff   (30.01.05 11:04)
> зарезервирован более суток (восьми часов, двух часов - настраивается
> - плод вырубона электричества или снятия клиента по Ctrl-Alt-Del)

более суток не очень приятно. да и так, остается мизерная вероятность того, что появится документы с нарушеной хронологической последовательностью (например, последовательность:
20.10.2004  235
20.10.2004  237
21.10.2004  236
), а это более недопустимо чем дырки. Точнее, это-то как раз и недопустимо для ряда документов законодательно, а дырки допустимы, по-крайней мере, я не знаю таких документов, где дырки запрещены законодательно.


 
Sergey_Masloff   (2005-01-30 14:55) [44]

Danilka ©   (30.01.05 13:58) [43]
Ну настрой на 20 минут. Не оформил документ за 20 минут - в сад. Вобщем, все настраивается. В конкретно той задаче были именно такие условия - чтобы дырок не было и 1 день. Так и сделал.

>я не знаю таких документов, где дырки запрещены законодательно
Это в библиотечном учете. Не помню точно но руководящий документ есть. Они до этого шахматки рисовали знаешь наверное такая расчерченая бумажка с номерами присвоил - зачеркни.


 
Petr V. Abramov ©   (2005-01-30 16:29) [45]

Sergey_Masloff   (30.01.05 11:04) [42]
> А потом юзер думае - а на фиг этот документ.
 Уточняю: вся это происходит непосредственно перед коммит, т.е. когда уже нажато Save и пути обратно нет. Иначе в блокировку вопрешься 100%

> Ну не знаю. Я когда-то сделал так:
>  Когда пользователь создает новый документ  (пока у себя - записи в базу нет) процедура берет новый номер генератора и ....
Выключили свет -> дырка в номерах :)  Генератор-то работает не в контексте транзакции, поэтому при recovery его значение не откатится.


 
Sergey_Masloff   (2005-01-30 16:44) [46]

Petr V. Abramov ©   (30.01.05 16:29) [45]
Ты не понял метод. Номер генерится ДО всего. Единственно что может произойти - выключение света за ту долю секундыкоторую занимает запись 1 записи в кэш. Если не в лом еще раз прочти изложеную методику.
 Начинается все с того что вызывается функция которая
1) Дергает генератор
2) Пишет его значение в кэш с описаными атрибутами
3) Коммитит
4) Возвращает значение пользователю (документа еще нет)

Время выполнения этого - ну не знаю, ну пара-тройка сотен тактов процессора.То есть с выключением очень точно надо угадать.


 
Anatoly Podgoretsky ©   (2005-01-30 17:10) [47]

Номер можно присваивать и после сохранения, только нуже таймстамп. Отсутствие дырок и последовательность в данном случае гарантирована.


 
Petr V. Abramov ©   (2005-01-30 23:41) [48]

> Sergey_Masloff   (30.01.05 16:44) [46]
> Ты не понял метод.
 IMHO, понял
>  Единственно что может произойти -
выключение света за ту долю секунды которую занимает запись 1 записи в кэш.
 Вероятность ж... , не спорю, очень мала. Но, к сожалению,
    Законы Мерфи имеют приоритет над законами больших чисел

> Anatoly Podgoretsky ©   (28.01.05 20:14) [41]
> Без дырок говоришь, тогда надо закладывать право
> обязательности и неудоляемости
 и регулярного backup`а, чтоб совсем глубокой дырки не было :)


 
Danilka ©   (2005-01-31 08:48) [49]

[44] Sergey_Masloff   (30.01.05 14:55)
Понятно. Но, как справедливо заметил [41], в таком случае их и удалять надо запрещать.



Страницы: 1 2 вся ветка

Текущий архив: 2005.02.27;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.032 c
14-1107765529
msguns
2005-02-07 11:38
2005.02.27
Синкопирование


9-1101743785
lifo
2004-11-29 18:56
2005.02.27
Избитая наверное тема ......


1-1108203908
tazik
2005-02-12 13:25
2005.02.27
Как выполнить/запустить файл?


6-1103304647
AdmeraL
2004-12-17 20:30
2005.02.27
TclientSocket .... TserverSocket


1-1108026196
MrFor
2005-02-10 12:03
2005.02.27
Глупый вопрос про цикл