Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Пропуск ID в автоинкременте MSSQL 2008  [new]
magellane
Member

Откуда:
Сообщений: 3
Есть рабочая база MSSQL 2008 r2 enterprise. Добавлено поле автоинкримента. Приметно раз в 5-10 секунд добавляется новая запись. Но есть пропуск в добавлениях ровно в 22 тыс с 13926258 по 13948259.
Подскажите пожалуйста, как такое возможно?
1 мар 13, 17:15    [14000310]     Ответить | Цитировать Сообщить модератору
 Re: Пропуск ID в автоинкременте MSSQL 2008  [new]
Glory
Member

Откуда:
Сообщений: 104751
magellane
Подскажите пожалуйста, как такое возможно?

begin transaction
insert into mytable_with_identity
rollback transaction
1 мар 13, 17:16    [14000318]     Ответить | Цитировать Сообщить модератору
 Re: Пропуск ID в автоинкременте MSSQL 2008  [new]
Гость333
Member

Откуда:
Сообщений: 3683
magellane,

Например, записи были удалены. Либо транзакция, в которой вставлялись эти записи, откатилась по какой-либо причине. Значение ident_current при этом не откатывается.
1 мар 13, 17:17    [14000323]     Ответить | Цитировать Сообщить модератору
 Re: Пропуск ID в автоинкременте MSSQL 2008  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Ещё, как вариант, была выполнена команда DBCC CHECKIDENT ( table_name, RESEED, new_reseed_value )
1 мар 13, 17:19    [14000340]     Ответить | Цитировать Сообщить модератору
 Re: Пропуск ID в автоинкременте MSSQL 2008  [new]
magellane
Member

Откуда:
Сообщений: 3
Дело в том что фиксируется время записи и разница в 5 секунд между ними. Могло ли что то поменять за 5 сек 22тыс записей. DBCC CHECKIDENT очень очень вряд ли кто то делала. Еще пишутся логи в txt параллельно с базой. Записи точно не пропадали. Но все может быть. Спасибо!
1 мар 13, 17:47    [14000471]     Ответить | Цитировать Сообщить модератору
 Re: Пропуск ID в автоинкременте MSSQL 2008  [new]
magellane
Member

Откуда:
Сообщений: 3
Еще настроена Мерге репликация, извините сразу забыл написать. И обнаружился пропуск когда с стороны подписчика записи начали писаться в те пропущенные ID
1 мар 13, 17:56    [14000533]     Ответить | Цитировать Сообщить модератору
 Re: Пропуск ID в автоинкременте MSSQL 2008  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6202
В очередной раз задаюсь вопросом: почему людей так беспокоят эти дырки в последовательностях?
1 мар 13, 18:30    [14000643]     Ответить | Цитировать Сообщить модератору
 Re: Пропуск ID в автоинкременте MSSQL 2008  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
Сон Веры Павловны
В очередной раз задаюсь вопросом: почему людей так беспокоят эти дырки в последовательностях?
люди часто используют эти номера не как внутренние ссылки на которые никто не смотрит
а как внешние номера например накладных которые печатаются или произносятся по телефону
а надежную непрерывную нумерацию не совсем просто реализовать
1 мар 13, 18:58    [14000739]     Ответить | Цитировать Сообщить модератору
 Re: Пропуск ID в автоинкременте MSSQL 2008  [new]
medoed
Member

Откуда:
Сообщений: 979
leov,
А разве правильно номера автоматически сгенерённых полей в базе использовать для нумерации каких то документов в бизнесе!?
В oracle есть secuence (счетчик) для таких целей, вы там сами рулете приростом и с каким номером получить следующую запись номер.
Если мы говорим про MSSQL - может проще держать таблицу с номерами и туда вставлять каждый раз номер для нумерации (max + 1 с высоким уровнем изоляции?)
В своё время видел готовый способ по непрерывной нумерации от De@Colores по-моему.
4 мар 13, 17:43    [14010300]     Ответить | Цитировать Сообщить модератору
 Re: Пропуск ID в автоинкременте MSSQL 2008  [new]
Гость333
Member

Откуда:
Сообщений: 3683
medoed
В oracle есть secuence (счетчик) для таких целей

Расскажите, как вы используете sequence для таких целей, с учётом его нетранзакционности.
4 мар 13, 17:52    [14010340]     Ответить | Цитировать Сообщить модератору
 Re: Пропуск ID в автоинкременте MSSQL 2008  [new]
medoed
Member

Откуда:
Сообщений: 979
Гость333,

seq.nextval - как то так, правда я это сейчас использую для DB2. Насчет нетранзакционности - не совсем понял. Я так понимаю , secuence связан с таблицей, а какая сессия считает следующее значение - ему все равно.
Разъясните плиз, може что то я про sequence не уяснил?
4 мар 13, 18:04    [14010408]     Ответить | Цитировать Сообщить модератору
 Re: Пропуск ID в автоинкременте MSSQL 2008  [new]
Glory
Member

Откуда:
Сообщений: 104751
medoed
Разъясните плиз, може что то я про sequence не уяснил?

Как sequence предотвратит "Но есть пропуск в добавлениях ровно в 22 тыс с 13926258 по 13948259" ?
4 мар 13, 18:06    [14010415]     Ответить | Цитировать Сообщить модератору
 Re: Пропуск ID в автоинкременте MSSQL 2008  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
medoed
leov,
А разве правильно номера автоматически сгенерённых полей в базе использовать для нумерации каких то документов в бизнесе!?
В oracle есть secuence (счетчик) для таких целей, вы там сами рулете приростом и с каким номером получить следующую запись номер.
Если мы говорим про MSSQL - может проще держать таблицу с номерами и туда вставлять каждый раз номер для нумерации (max + 1 с высоким уровнем изоляции?)
В своё время видел готовый способ по непрерывной нумерации от De@Colores по-моему.
пока работает и не ругаются значит правильно. как ругаться начнут то сразу и неправильно :-)
да что sequence что identity что max+1 нифига при откате транзакции не спасут в общем случае.
изловчаться надо, может номер получать только в самом конце транзакции перед самым коммитом...
у меня работает пока. может уровень приложения не больно высокий
4 мар 13, 18:10    [14010434]     Ответить | Цитировать Сообщить модератору
 Re: Пропуск ID в автоинкременте MSSQL 2008  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
medoed
Гость333,

seq.nextval - как то так, правда я это сейчас использую для DB2. Насчет нетранзакционности - не совсем понял. Я так понимаю , secuence связан с таблицей, а какая сессия считает следующее значение - ему все равно.
Разъясните плиз, може что то я про sequence не уяснил?
насколько я помню в оракле sequence вобще с таблицей никак не связан. хотя могу и ошибаться.
по моему nextval выхватывает очередной номер для разных сессий
и если кто-то из ранее взявших не закоммитится то тоже дырка получится
ничем оно не лучше identity
4 мар 13, 18:15    [14010473]     Ответить | Цитировать Сообщить модератору
 Re: Пропуск ID в автоинкременте MSSQL 2008  [new]
Гость333
Member

Откуда:
Сообщений: 3683
medoed
Насчет нетранзакционности - не совсем понял.

Connected to Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 
Connected as test@orcl
 
SQL> 
SQL> create sequence seq_test start with 1 increment by 1;
 
Sequence created
SQL> create table tst (id int, str varchar2(100));
 
Table created
SQL> insert into tst(id, str) values(seq_test.nextval, 'String 1');
 
1 row inserted
SQL> commit;
 
Commit complete
SQL> insert into tst(id, str) values(seq_test.nextval, 'String 2');
 
1 row inserted
SQL> rollback;
 
Rollback complete
SQL> insert into tst(id, str) values(seq_test.nextval, 'String 3');
 
1 row inserted
SQL> commit;
 
Commit complete
SQL> select * from tst;
 
                                     ID STR
--------------------------------------- --------------------------------------------------------------------------------
                                      1 String 1
                                      3 String 3

Транзакцию откатили — значение сиквенса не откатилось. Это и есть нетранзакционность, за счёт чего получили дырку в нумерации.

medoed
Я так понимаю , secuence связан с таблицей

Связи нет, разве что логическая связь на уровне хранимой логики. Можно один сиквенс использовать в каком угодно количестве таблиц, также как в одной таблице — любое количество сиквенсов.
4 мар 13, 18:22    [14010501]     Ответить | Цитировать Сообщить модератору
 Re: Пропуск ID в автоинкременте MSSQL 2008  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6202
Гость333
Это и есть нетранзакционность, за счёт чего получили дырку в нумерации.

Не стоит еще и забывать про опцию кэширования сиквенсов - закэшированные для более быстрой выдачи значения теряются при падении инстанса. По умолчанию кэшируется, если мне не изменяет память, 20 значений.

И да, про высказанный выше вопрос: я действительно считаю странным использовать чисто технологическую, в общем-то, информацию от механизма автоинкремента в качестве внешней нумерации в документах. И здесь неважно, как реализован автоикремент - на сивенсах, или на identity.
4 мар 13, 19:12    [14010675]     Ответить | Цитировать Сообщить модератору
 Re: Пропуск ID в автоинкременте MSSQL 2008  [new]
medoed
Member

Откуда:
Сообщений: 979
Сон Веры Павловны
Гость333
Это и есть нетранзакционность, за счёт чего получили дырку в нумерации.

Не стоит еще и забывать про опцию кэширования сиквенсов - закэшированные для более быстрой выдачи значения теряются при падении инстанса. По умолчанию кэшируется, если мне не изменяет память, 20 значений.

И да, про высказанный выше вопрос: я действительно считаю странным использовать чисто технологическую, в общем-то, информацию от механизма автоинкремента в качестве внешней нумерации в документах. И здесь неважно, как реализован автоикремент - на сивенсах, или на identity.

Да насчет sequence, я прокосячил -плохой пример привел. Но хоть в чем то был прав, нельзя техническую возможнось автоматического наращивания счетчика в базе использовать для нумерации реальных документов. Интересно если бы поле было guid, его бы тоже для нумерации заюзали:-)
4 мар 13, 19:58    [14010814]     Ответить | Цитировать Сообщить модератору
 Re: Пропуск ID в автоинкременте MSSQL 2008  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
Сон Веры Павловны
И да, про высказанный выше вопрос: я действительно считаю странным использовать чисто технологическую, в общем-то, информацию от механизма автоинкремента в качестве внешней нумерации в документах. И здесь неважно, как реализован автоикремент - на сивенсах, или на identity.
а как вы предлагаете решать проблему нумерации документов?
потому как изначальный то вопрос заключался именно в этом
4 мар 13, 22:45    [14011159]     Ответить | Цитировать Сообщить модератору
 Re: Пропуск ID в автоинкременте MSSQL 2008  [new]
BagaBaga
Member

Откуда: прекрасное далеко
Сообщений: 667
Хм, а можно я встряну со своим вопросом того же толка?

Как "правильно" организовать непрерывную нумерацию, причём чтобы не было "дырок" и номер каждого "последующего" документа был больше любого предыдущего?

Откуда такой вопрос? Да есть пара нормативных актов, которые предъявляют именно такие требования (строго последовательно, по возрастанию, без дырок) к ряду документов...
4 мар 13, 23:36    [14011324]     Ответить | Цитировать Сообщить модератору
 Re: Пропуск ID в автоинкременте MSSQL 2008  [new]
Crimean
Member

Откуда:
Сообщений: 13147
можно сделать свои сиквенсы. + апи "возврата" выданного номера для повторного получения
+ для совсем брошеных случаев - регламентом возвращать "дырки"
4 мар 13, 23:53    [14011362]     Ответить | Цитировать Сообщить модератору
 Re: Пропуск ID в автоинкременте MSSQL 2008  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31985
BagaBaga
Как "правильно" организовать непрерывную нумерацию, причём чтобы не было "дырок" и номер каждого "последующего" документа был больше любого предыдущего?

Откуда такой вопрос? Да есть пара нормативных актов, которые предъявляют именно такие требования (строго последовательно, по возрастанию, без дырок) к ряду документов...
Как видно из этого обсуждения, это вопрос не программирования, а бизнес-логики.

Что делать, если заведены 2 документа с последовательными номерами, а потом в процессе обработки первый из них удаляется?

Вот собственно и решают, как написано в этих документах.

Например, нумеруют после окончательной проводки документа, последним действием, поле чего такой документ уже нельзя удалять.
Естественно, никаких откатов и отмен транзакций в этом случае не может быть, так что и проблем никаких не возникает.

Или выдают "удалённые" номера повторно. Хотя это уже нарушение нормативных актов, посольку будет момент, когда есть "дырка".
5 мар 13, 00:26    [14011451]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить