четверг, ноября 09, 2006

Дыбр

Битвы на стенде продолжаются.

Есть таблица A(Id bigint not null identity, Data varchar(max))

Есть процедура sp_Abyrvalg, содержащая строки:
INSERT INTO A(Data) VALUES('Some data')
DECLARE @x bigint
SET @x = SCOPE_IDENTITY()

Вдобавок к этому есть многопроцессорный сервер, на котором процедура sp_Abyrvalg выполняется одновременно сразу на двух процессорах.

Внимание, вопрос.
Если последнее значеие Id в A было X, то чему будут равны значения @x после выполнения вставки на первом и втором процессоре соответственно?

4 комментария:

Unknown комментирует...

книга юных лесных сурков гласит:
The SCOPE_IDENTITY() function will return the NULL value if the function is invoked before any insert statements into an identity column occur in the scope.
Короче, если у тебя вдруг вернулось NULL (а нефиг подсказки в вопросе подсовывать!), значит просто не вставилось почему-то.
Вообще, если вставка в таблу не вызывает (с помощью триггера) новых вставок и новых генераций identity, я бы юзал @@identity.
Про двухпроцессорный сервер и одновременное выполнение - забей ;)

Das Ich комментирует...

Очень ты быстрый. NULL не вернулось.

Unknown комментирует...

а что вернулось?
только не говори, что два одинаковых числа типа х+1 или х+2. я в это не поверю.

Das Ich комментирует...

Две вставки выполняются на самом деле параллельно. Хуже того, они выполняются в ОДНОЙ транзакции. И, похоже (не можем больше воспроизвести), что в этом случае возвращают X+(1|2) для любой из двух вставок.