SQL Server - обновление 1 столбца, требуется ли блокировка? - PullRequest
1 голос
/ 22 июля 2011

Мне нужны уникальные идентификаторы в моем приложении. Для этого я создал таблицу в своей базе данных, которая содержит только 1 столбец «unique_id» (BIGINT) и 1 строку. Идея состоит в том, чтобы использовать хранимую процедуру, чтобы получить следующий идентификатор, когда мне это нужно. Я подумал, что однострочная операция будет такой:

UPDATE identifier_table SET unique_id = unique_id + 1 OUTPUT INSERTED.unique_id

Может ли кто-нибудь подтвердить, является ли эта операция атомарной или мне нужно установить блокировку на столе?

Спасибо!

1 Ответ

0 голосов
/ 06 февраля 2012

Это атомно.Это всего лишь один оператор обновления, и у него не будет никаких проблем с параллелизмом, поскольку он будет управляться ядром с блокировками обновления.Вы можете использовать OUTPUT, как показано, или вы можете сделать что-то вроде этого:

DECLARE @unique_id bigint;

UPDATE identifier_table
SET
   @unique_id = unique_id + 1,
   unique_id = unique_id + 1;

SELECT @unique_id uniqueid;

Если вы сделаете @unique_id параметром OUTPUT, то вы можете получить значение без оператора select или легко использовать его в другомхранимая процедура.

...