У меня есть хранимая процедура, которая, помимо прочего, делает некоторые вставки в другую таблицу внутри цикла. См. Пример ниже для более ясного понимания:
INSERT INTO T1 VALUES ('something')
SET @MyID = Scope_Identity()
... some stuff go here
INSERT INTO T2 VALUES (@MyID, 'something else')
... The rest of the procedure
Эти две таблицы (T1 и T2) имеют столбец IDENTITY (1, 1) в каждой из них, назовем их ID1 и ID2; однако после выполнения процедуры в нашей производственной базе данных (очень загруженной базе данных) и наличии более 6250 записей в каждой таблице я заметил один случай, когда ID1 не совпадает с ID2! Хотя обычно для каждой записи, вставляемой в T1, в T2 вставляется запись, и столбец идентификаторов в обоих последовательно увеличивается.
"Неправильные" записи были примерно такими:
ID1 Col1
---- ---------
4709 data-4709
4710 data-4710
ID2 ID1 Col1
---- ---- ---------
4709 4710 data-4710
4710 4709 data-4709
Обратите внимание на «перевернутый», ID1 во второй таблице.
Не слишком зная о SQL Server под операциями, я изложил следующую «теорию», может быть, кто-то может исправить меня в этом.
Что я думаю, так это то, что поскольку цикл выполняется быстрее, чем физическая запись в таблицу, и / или, возможно, что-то другое задержало процесс записи, записи были буферизованы. Когда приходит время их писать, они написаны не в определенном порядке.
Возможно ли вообще, если нет, как объяснить вышеупомянутый сценарий?
Если да, тогда у меня есть еще один вопрос. Что делать, если первая вставка (из кода выше) задерживается? Разве это не значит, что я не получу правильную IDENTITY для вставки во вторую таблицу? Если ответ на этот вопрос также положительный, что я могу сделать, чтобы гарантировать, что вставка в две таблицы произойдет последовательно с правильной ИДЕНТИЧНОСТЬЮ?
Я ценю любые комментарии и информацию, которые помогут мне понять это.
Заранее спасибо.