Как синхронизировать между транзакциями - PullRequest
2 голосов
/ 28 марта 2012

У меня есть следующая хранимая процедура. Это предназначено, чтобы получить имя. Если имя существует в таблице, оно возвращает соответствующий идентификатор. Если он еще не существует, он создает новый идентификатор и добавляет его в таблицу с новым идентификатором.

Проблема в том, что когда я запускаю это в нескольких потоках, которые используют одно и то же имя (еще не в таблице), я иногда получаю имя, введенное несколько раз, с последующими идентификаторами.

Я хотел бы, чтобы транзакции блокировались во время выполнения другой транзакции, чтобы имя попадало в базу данных только один раз.

Есть ли уровень изоляции или выбрать подсказку, которую я должен использовать? Есть ли другой способ сделать это?

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

1 Ответ

1 голос
/ 28 марта 2012

Оба процесса должны быть в одной транзакции, чтобы достичь желаемого.

Этого можно добиться, удалив управление транзакциями в процедуре [sp_generateNewId].

К вашему сведению, вам не нужно беспокоиться о генерации ключей, почему бы вам просто не создать поле IDENTITY

...