我创建了这个非常基本的存储过程,当用户创建特定类型的项目时,我们的 cms 会调用它。但是,看起来有时我们会为使用相同数据创建的每个 cms 项目获得两行,但是是一个 off-by-one SourceID
。我没有做太多的 SQL 工作,所以这可能是一些基本的事情 - 但我是否需要在存储过程中以某种方式显式锁定表以防止这种情况发生?
这是存储过程代码:
BEGIN
SET @newid = (SELECT MAX(SourceID)+1 from [dbo].[sourcecode])
IF NOT EXISTS(SELECT SourceId from [dbo].[sourcecode] where SourceId = @newid)
INSERT INTO [dbo].[sourcecode]
(
SourceID,
Description,
RunCounts,
ShowOnReport,
SourceParentID,
ApprovedSource,
Created
)
VALUES
(
@newid,
@Desc,
1,
@ShowOnReport,
1,
1,
GetDate()
)
RETURN @newid
END
这是重复数据的示例(少了几个不相关的列):
SourceId Description Created
676 some text 2012-10-17 09:42:36.553
677 some text 2012-10-17 09:43:01.380