Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.02.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.54 MB
Время: 0.043 c
4-1101829091
MAINUSER
2004-11-30 18:38
2005.02.27
Ошибка в работе с ReadDirectoryChangesW


9-1102065795
lifo
2004-12-03 12:23
2005.02.27
Спрайт


14-1107704718
Aldor_
2005-02-06 18:45
2005.02.27
Измерить объективное расстояние между пикселами на экране


1-1108020182
Cosinus
2005-02-10 10:23
2005.02.27
Parser. Как сделать быстрее и с минимальной затратой памяти?


14-1107767464
Хинт
2005-02-07 12:11
2005.02.27
XP и 2000





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский