@@ IDENTITY and Concurrence - PullRequest
       2

@@ IDENTITY and Concurrence

2 голосов
/ 03 июня 2011

Допустим, у меня есть таблица TableA , первичный ключ которой помечен как IDENTITY, и что я выполняю следующие два оператора в хранимой процедуре

INSERT INTO TableA VALUES ('a', 'b', 'c', 'd')
SET @SomeVariable = @@IDENTITY

, чтобы @SomeVariable хранит первичный ключ только что добавленной стоимости.Если другой клиент выполняет такую ​​же вставку между выполнением приведенных выше операторов, возможно ли, что @@IDENTITY и, следовательно, @SomeVariable сохранит неправильное (самое последнее) значение?

Большое спасибо.

Ответы [ 2 ]

5 голосов
/ 03 июня 2011

@@IDENTITY предназначен для только вашего соединения (не глобального), поэтому вы должны получить последнее значение IDENTITY, которое произошло в вашем соединении.Однако это может быть из другой области видимости, например, триггера.

Вот почему SCOPE_IDENTITY() является наилучшей практикой: она предназначена для области действия с INSERT и не учитываеттриггеры аккаунта и т. д.

Для действительно глобального, неконкурентного и откровенно идиотского решения это IDENT_CURRENT.На это будут влиять все, кто подключается и пишет в таблицу.

0 голосов
/ 03 июня 2011

Это действительно зависит от того, что вы подразумеваете под другим клиентом. @@ IDENTITY возвращает последнее значение идентификатора, созданное для соединения / сеанса (независимо от таблицы или области действия команды).

Так что, если ваши клиенты не разделяют соединение, ответ будет отрицательным. Если они разделяют связь (я так не думаю, потому что у нее будет много других проблем), ответ - да.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...