我有一個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是一個完全不同的野獸。
第一個問題是什麼是編碼'檢查,然後更新模式'的正確方法?看起來我需要在檢查過程中獲得一個排它鎖,而不是共享鎖,但我不清楚這是否是最好的方式。任何幫助正確的方向將不勝感激。提前致謝。