我有以下存储过程。这是为了获得一个名字。如果名称存在于表中,则返回其对应的ID。如果它还不存在,它会创建一个新ID,并使用新ID将其添加到表中。
问题在于,当我在多个使用相同名称的线程上运行它(尚未在表中)时,我有时会多次输入名称,并带有后续ID。
我希望在另一个事务正在运行时阻止事务,以便该名称只在数据库中获取一次。
是否存在隔离级别或选择提示我应该使用?还有另一种方法吗?
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
答案 0 :(得分:1)
这两个过程都应该在同一个交易上,以达到你想要的目的。
您可以通过删除[sp_generateNewId] proc中的事务控制来实现此目的。
仅供参考,您无需担心密钥生成,为什么不创建IDENTITY字段