Как SQL Server генерирует значения в столбце идентификаторов?

Мой вопрос: если у меня есть две пакетные вставки в одну таблицу параллельно, как SQL Server создает значения идентификаторов?

Я имею в виду, если в одном сеансе я вставлю несколько строк (Row1-Row2-Row3), а другой сеанс одновременно вставит несколько строк (Row4-Row5-Row6), результат будет таким?

Row1
Row2
Row3
Row4
Row5
Row6

или может что-то вроде этого?

Row1
Row6
Row3
Row5
Row4
Row2

person vesna    schedule 25.09.2012    source источник


Ответы (1)


Вы совершаете распространенную ошибку, предполагая порядок в таблице. Столы не имеют порядка. Только результаты имеют порядок, который не определен, если не указан явный ORDER BY.

Вы можете задать другой вопрос: как присваивается сгенерированное значение идентификатора в случае параллельных вставок? Ответ прост: это не имеет значения. И если вы сделаете какое-либо предположение о порядке, то ваш код не работает. То же самое касается пробелов. Ваше приложение должно работать, даже если сгенерированные идентификаторы полностью случайны, а правильно написанное приложение будет работать, если идентификатор полностью случайный. Используйте SCOPE_IDENTITY() для получения последнего вставленного удостоверения. Еще лучше использовать пункт OUTPUT в INSERT, он работает для нескольких вставки строк тоже.

Для справки: идентификаторы генерируются в том порядке, в котором операции получают доступ к поток журнала.

person Remus Rusanu    schedule 25.09.2012
comment
спасибо за повтор. Я использовал SCOPE_IDENTITY(), но я хочу знать, могу ли я быть уверен, что в пакетной вставке моя предыдущая идентификация равна SCOPE_IDENTITY()-1 или нет? - person vesna; 25.09.2012
comment
Плохое предположение. Как я уже сказал, используйте предложение OUTPUT для многострочных вставок. - person Remus Rusanu; 25.09.2012