我有一个SQLServer 2008数据库,其中有一个标签表。标签只是一个id和一个名字。标签表的定义如下所示: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
我的问题是,除了是在并行数据库设计新手等,似乎就是导致我偶尔会得到一个错误的竞争条件,我试图在数据库中输入重复的密钥(名称)。错误是:
无法在具有唯一索引'IX_Tag_Name'的对象'dbo.Tag'中插入重复键行。
这是有道理的,我只是不知道如何解决这个问题。如果它的代码我会知道如何锁定正确的区域。 SQLServer是一个完全不同的野兽。
第一个问题是什么是编码'检查,然后更新模式'的正确方法?看起来我需要在检查过程中获得一个排它锁,而不是共享锁,但我不清楚这是否是最好的方式。任何帮助正确的方向将不胜感激。提前致谢。