У меня есть база данных SQLServer 2008, в которой у меня есть таблица для тегов. Тег - это просто идентификатор и имя. Определение таблицы тегов выглядит так:Вопрос о параллельном тестировании SQL
CREATE TABLE [dbo].[Tag](
[ID] [int] IDENTITY(1,1) NOT NULL,
[Name] [varchar](255) NOT NULL
CONSTRAINT [PK_Tag] PRIMARY KEY CLUSTERED
(
[ID] ASC
)WITH (PAD_INDEX = OFF,
STATISTICS_NORECOMPUTE = OFF,
IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON,
ALLOW_PAGE_LOCKS = ON)
)
Название также является уникальным индексом. Далее у меня есть несколько процессов, добавляющих данные в эту таблицу довольно быстро. Эти процессы используют хранимую процедуру, которая выглядит как:
ALTER PROC [dbo].[lg_Tag_Insert]
@Name varchar(255)
AS
DECLARE @ID int
SET @ID = (select ID from Tag where [email protected])
if @ID is null
begin
INSERT Tag(Name)
VALUES (@Name)
RETURN SCOPE_IDENTITY()
end
else
begin
return @ID
end
Моими вопросы, в том, что, кроме как новичок в параллельной разработке баз данных, кажется, есть состояние гонки, которая вызывает у меня иногда появляется сообщение об ошибке, что я Я пытаюсь ввести дубликаты ключей (Имя) в БД. Ошибка:
Невозможно вставить повторяющуюся строку ключа в объект 'dbo.Tag' с уникальным индексом 'IX_Tag_Name'.
Это имеет смысл, я просто не знаю, как это исправить. Если это где код, я бы знал, как заблокировать правильные области. SQLServer - совсем другой зверь.
Первый вопрос - это правильный способ кодирования этой «проверки, а затем обновления шаблона»? Кажется, мне нужно получить эксклюзивную блокировку строки во время проверки, а не общую блокировку, но мне не совсем понятно, как это сделать. Любая помощь в правильном направлении будет принята с благодарностью. Заранее спасибо.