Форум: "Базы";
Текущий архив: 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