Мне нужна последовательность чисел для приложения, и я надеюсь использовать возможности SQL Server для этого. Я создал следующую таблицу и процедуру (в SQL Server 2005):
CREATE TABLE sequences (
seq_name varchar(50) NOT NULL,
seq_value int NOT NULL
)
CREATE PROCEDURE nextval
@seq_name varchar(50)
AS
BEGIN
DECLARE @seq_value INT
SET @seq_value = -1
UPDATE sequences
SET @seq_value = seq_value = seq_value + 1
WHERE seq_name = @seq_name
RETURN @seq_value
END
Я немного обеспокоен тем, что без блокировки таблицы / строки другой запрос может произойти одновременно и в конечном итоге вернуть тот же номер в другой поток или клиент. Это было бы очень плохо, очевидно. Безопасен ли этот дизайн в этом отношении? Могу ли я добавить что-нибудь, что добавит необходимую блокировку, чтобы сделать его безопасным?
Примечание: я знаю о вставках IDENTITY в SQL Server - и это не то, что я ищу в данном конкретном случае. В частности, я не хочу вставлять / удалять строки. По сути, это центральная таблица, которая управляет генератором последовательных чисел для ряда последовательностей.