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

Откуда: Жатай->Подольск
Сообщений: 137
Создадим таблицу
CREATE TABLE [dbo].[Table1](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[sCaption] [nvarchar](50) NOT NULL,
 CONSTRAINT [PK_Table1] PRIMARY KEY CLUSTERED 
(
	[id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO


при операции INSERT
BEGIN TRAN
INSERT INTO [dbo].[Table1] (sCaption) VALUES ('a')
COMMIT

получим в таблице 1 запись с идентификатором -1

после подобной операции
BEGIN TRAN
INSERT INTO [dbo].[Table1] (sCaption) VALUES ('b')
ROLLBACK

счетчик IDENTITY увеличится, но вставка не будет произведена

Как можно с подобным поведением бороться ?
30 окт 12, 10:37    [13395010]     Ответить | Цитировать Сообщить модератору
 Re: Решение проблемы с IDENTITY  [new]
Glory
Member

Откуда:
Сообщений: 104760
Matroskin
Как можно с подобным поведением бороться ?

Не отменять транзакцию.
30 окт 12, 10:38    [13395017]     Ответить | Цитировать Сообщить модератору
 Re: Решение проблемы с IDENTITY  [new]
antbr
Member

Откуда:
Сообщений: 75
Matroskin,
зачем с этим бороться?
30 окт 12, 10:39    [13395026]     Ответить | Цитировать Сообщить модератору
 Re: Решение проблемы с IDENTITY  [new]
UniqueNick
Member

Откуда: Москва
Сообщений: 42
Matroskin
счетчик IDENTITY увеличится, но вставка не будет произведена

Как можно с подобным поведением бороться ?


А зачем с ним бороться?
Не стоит рассчитывать на то, что IDENTITY будет без "дырок", тогда и бороться не придётся :)
30 окт 12, 10:40    [13395033]     Ответить | Цитировать Сообщить модератору
 Re: Решение проблемы с IDENTITY  [new]
Matroskin
Member

Откуда: Жатай->Подольск
Сообщений: 137
Glory
Matroskin
Как можно с подобным поведением бороться ?

Не отменять транзакцию.


ROLLBACK ведь может быть и не явно выполненной пользователем командой
30 окт 12, 10:41    [13395035]     Ответить | Цитировать Сообщить модератору
 Re: Решение проблемы с IDENTITY  [new]
Glory
Member

Откуда:
Сообщений: 104760
Matroskin
ROLLBACK ведь может быть и не явно выполненной пользователем командой

Тогда читать про документированное поведение identity
30 окт 12, 10:42    [13395041]     Ответить | Цитировать Сообщить модератору
 Re: Решение проблемы с IDENTITY  [new]
Spinifex
Member

Откуда:
Сообщений: 55
Это вовсе не баг, а очень даже хорошая фича. Т.е. фактически вы хотите сделать identity столбец не транзакционным (другие пользователи ведь тоже могут работать с этой таблицей и параллельно вставлять туда данные).
Совет здесь такой: либо принять identity такой какой он есть, либо если уж очень нужно самому реализовать логику управления инкрементацией.
30 окт 12, 10:49    [13395085]     Ответить | Цитировать Сообщить модератору
 Re: Решение проблемы с IDENTITY  [new]
Crimean
Member

Откуда:
Сообщений: 13148
Spinifex
самому реализовать логику управления инкрементацией


максимум, что можно сделать - регистрировать "отмены" выдачи идентификаторов и после "перевыдавать" их
но - будет дополнительная конкуренция за "перевыдачи" :)
30 окт 12, 12:06    [13395600]     Ответить | Цитировать Сообщить модератору
 Re: Решение проблемы с IDENTITY  [new]
Spinifex
Member

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

Ну почему же, кто знает что там за бизнес логика вдруг можно придумать некую хеш функцию над другими Id. Или вообще перейти на Guid. Все зависит от задачи... Или действительно лучше подумать как уменьшить rollback's. Но во всяком случает использовать что-то вроде DBCC CHECKIDENT (, RESEED, ) не стоит.
30 окт 12, 12:20    [13395712]     Ответить | Цитировать Сообщить модератору
 Re: Решение проблемы с IDENTITY  [new]
Crimean
Member

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

гуиды - вариант для "идентификации". но не вариант для "последовательной идентификации". хеш - не вариант для идентификации вообще ибо как только появляется "хеш для идентификации" - сразу надо заводить "коллекции коллизий"
30 окт 12, 12:25    [13395751]     Ответить | Цитировать Сообщить модератору
 Re: Решение проблемы с IDENTITY  [new]
Spinifex
Member

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

Да это конечно так, но ведь и решаемую задачу мы не знаем. Если нужна последовательная идентификация, то в какой мере? Может нам будет достаточно ли нам будет NEWSEQUENTIALID()? Возможно удастся обойтись без коллизий (возможность нарваться на которые безусловно нужно будет учитывать при разработке своего механизма)?
30 окт 12, 12:33    [13395812]     Ответить | Цитировать Сообщить модератору
 Re: Решение проблемы с IDENTITY  [new]
Matroskin
Member

Откуда: Жатай->Подольск
Сообщений: 137
Spinifex
Crimean,

Ну почему же, кто знает что там за бизнес логика вдруг можно придумать некую хеш функцию над другими Id. Или вообще перейти на Guid. Все зависит от задачи... Или действительно лучше подумать как уменьшить rollback's. Но во всяком случает использовать что-то вроде DBCC CHECKIDENT (, RESEED, ) не стоит.


Не, GUID не хочу.
Я сейчас пытаюсь убедить народ, что нужно уйти от него.

Единственная мысль, сделать JOB который будет отрабатывать при достижении определенного значение id identity и производить некую перестройку.
С учетом существования FK надо будет сделать автоматически генерируемую процедуру для обеспечения целостности.
30 окт 12, 13:24    [13396302]     Ответить | Цитировать Сообщить модератору
 Re: Решение проблемы с IDENTITY  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Matroskin
Единственная мысль, сделать JOB который будет отрабатывать при достижении определенного значение id identity и производить некую перестройку.
С учетом существования FK надо будет сделать автоматически генерируемую процедуру для обеспечения целостности.
Вам реально больше нечем заняться, что ли? Дырки в identity - это не по феншую?
30 окт 12, 13:34    [13396413]     Ответить | Цитировать Сообщить модератору
 Re: Решение проблемы с IDENTITY  [new]
Glory
Member

Откуда:
Сообщений: 104760
Matroskin
Единственная мысль, сделать JOB который будет отрабатывать при достижении определенного значение id identity и производить некую перестройку.
С учетом существования FK надо будет сделать автоматически генерируемую процедуру для обеспечения целостности.

Если вам нужна непрерывна нумерация, то оставьте identity в покое и создайте AK. Который и "перестрайвайте" без всяких оглядок на FK
30 окт 12, 13:37    [13396460]     Ответить | Цитировать Сообщить модератору
 Re: Решение проблемы с IDENTITY  [new]
invm
Member

Откуда: Москва
Сообщений: 9406
Matroskin,

И все-таки, интересно было бы узнать -- какой профит вы ожидаете получить от непрерывности значений id?
30 окт 12, 13:41    [13396489]     Ответить | Цитировать Сообщить модератору
 Re: Решение проблемы с IDENTITY  [new]
Matroskin
Member

Откуда: Жатай->Подольск
Сообщений: 137
Гавриленко Сергей Алексеевич
Matroskin
Единственная мысль, сделать JOB который будет отрабатывать при достижении определенного значение id identity и производить некую перестройку.
С учетом существования FK надо будет сделать автоматически генерируемую процедуру для обеспечения целостности.
Вам реально больше нечем заняться, что ли? Дырки в identity - это не по феншую?


Спросил на свою голову.

При особенностях текущей реализации и количестве попыток записей в таблицу, и откатах этих транзакций дырки могут быть размером от 1 до 10 тыс. С учетом того, что int не бесконечный может быть актуально.

Если текущую реализацию получится переделать сначала идеологически (убедив коллег), а затем и практически, то дырки в нумерации меня не будут сильно волновать.
30 окт 12, 16:31    [13398107]     Ответить | Цитировать Сообщить модератору
 Re: Решение проблемы с IDENTITY  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Matroskin
Спросил на свою голову.

При особенностях текущей реализации и количестве попыток записей в таблицу, и откатах этих транзакций дырки могут быть размером от 1 до 10 тыс. С учетом того, что int не бесконечный может быть актуально.

Если текущую реализацию получится переделать сначала идеологически (убедив коллег), а затем и практически, то дырки в нумерации меня не будут сильно волновать.
От 1 до 10 тыс. за какой интервал времени?
30 окт 12, 16:40    [13398170]     Ответить | Цитировать Сообщить модератору
 Re: Решение проблемы с IDENTITY  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3618
bigint вам в помощь
30 окт 12, 16:40    [13398175]     Ответить | Цитировать Сообщить модератору
 Re: Решение проблемы с IDENTITY  [new]
Matroskin
Member

Откуда: Жатай->Подольск
Сообщений: 137
Гавриленко Сергей Алексеевич,

в пределах одной безнес-операции над объектом, которая выполняется не более чем за 3 минуты
30 окт 12, 16:42    [13398193]     Ответить | Цитировать Сообщить модератору
 Re: Решение проблемы с IDENTITY  [new]
Glory
Member

Откуда:
Сообщений: 104760
Matroskin
в пределах одной безнес-операции над объектом, которая выполняется не более чем за 3 минуты

10 000 раз в 180 секунд заполнят диапазон 2,147,483,647 где то за 11 000 часов или 440 дней неприрывной(!) работы
а диапазон 9,223,372,036,854,775,807 где то за несколько миллионов лет
30 окт 12, 16:48    [13398244]     Ответить | Цитировать Сообщить модератору
 Re: Решение проблемы с IDENTITY  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Matroskin
Гавриленко Сергей Алексеевич,

в пределах одной безнес-операции над объектом, которая выполняется не более чем за 3 минуты
Если каждая трехминутная транзакция будет увеличивать счетчик на 10к, то размерности int вам хватит примерно на полтора года. Берите bigint тогда и не парьтесь.
30 окт 12, 16:51    [13398270]     Ответить | Цитировать Сообщить модератору
 Re: Решение проблемы с IDENTITY  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Интересно, sql 2012
msdn
CREATE SEQUENCE Test.ID_Seq
    START WITH 1
    INCREMENT BY 1 ;


как он работает при ROLLBACK. Тоже прерывается последовательность или нет?
30 окт 12, 16:55    [13398317]     Ответить | Цитировать Сообщить модератору
 Re: Решение проблемы с IDENTITY  [new]
Matroskin
Member

Откуда: Жатай->Подольск
Сообщений: 137
Гавриленко Сергей Алексеевич
Matroskin
Гавриленко Сергей Алексеевич,

в пределах одной безнес-операции над объектом, которая выполняется не более чем за 3 минуты
Если каждая трехминутная транзакция будет увеличивать счетчик на 10к, то размерности int вам хватит примерно на полтора года. Берите bigint тогда и не парьтесь.


Да, это будет пожалуй самым простым решением
30 окт 12, 17:02    [13398378]     Ответить | Цитировать Сообщить модератору
 Re: Решение проблемы с IDENTITY  [new]
Minamoto
Member

Откуда: Москва
Сообщений: 1162
trew
Интересно, sql 2012
msdn
CREATE SEQUENCE Test.ID_Seq
    START WITH 1
    INCREMENT BY 1 ;


как он работает при ROLLBACK. Тоже прерывается последовательность или нет?

В данном случае - аналогично. Увеличение происходит по вызову функции NEXT VALUE FOR, и ей безразлично, что вы там делаете с полученным значением - вставляете его в таблицу, не вставляете, или откатываете вставку.
30 окт 12, 17:29    [13398617]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить