У меня есть следующая хранимая процедура. Это предназначено, чтобы получить имя. Если имя существует в таблице, оно возвращает соответствующий идентификатор. Если он еще не существует, он создает новый идентификатор и добавляет его в таблицу с новым идентификатором.
Проблема в том, что когда я запускаю это в нескольких потоках, которые используют одно и то же имя (еще не в таблице), я иногда получаю имя, введенное несколько раз, с последующими идентификаторами.
Я хотел бы, чтобы транзакции блокировались во время выполнения другой транзакции, чтобы имя попадало в базу данных только один раз.
Есть ли уровень изоляции или выбрать подсказку, которую я должен использовать? Есть ли другой способ сделать это?
CREATE PROCEDURE [dbo].[sp_createID]
@name varchar(max)
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRAN
DECLARE @id as int
SELECT @id=Id FROM MyTbl WHERE name=@name
IF @id IS NULL
BEGIN
UPDATE idGeneratorTbl SET lastkey=lastkey+1
SELECT @id=lastKey FROM idGeneratorTbl
INSERT INTO MyTbl VALUES(@id, @name)
END
SELECT @id
COMMIT
END