Лучше не иметь этого требования - потому что это означает, что все транзакции, пытающиеся вставить в data
, сериализуются и блокируются до тех пор, пока предыдущие не выполнят фиксацию или откат.
В идеале вы должны использовать IDENTITY
илиSEQUENCE
вместо.
Но ни один из этих способов не гарантирует последовательность, и если это "необходимо иметь", то лучший способ - это обновить атом и прочитать значение одновременно.
Предположим, у вас есть следующая настройка
CREATE TABLE Consecutives
(
Scope VARCHAR(20) PRIMARY KEY,
Number INT
);
INSERT INTO Consecutives
VALUES ('Data',
76);
Затем введите код для увеличения значения и чтения результата, в то время как блокировка других транзакций приведена ниже.
DECLARE @Number INT;
UPDATE Consecutives
SET @Number = Number+=1
WHERE Scope = 'Data';
SELECT @Number
При этом используется семантика SET @variable = column = expression
UPDATE
, чтобы присвоить переменной значение столбца после обновления.
Это должно быть в той же транзакции, что и вставка в Data
, если вы хотите гарантировать отсутствие пробелов (по крайней мере,при отсутствии каких-либо удалений или обновлений в этом столбце)