如何在事务之间进行同步

时间:2012-03-28 10:05:00

标签: sql-server transactions locking

我有以下存储过程。这是为了获得一个名字。如果名称存在于表中,则返回其对应的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

1 个答案:

答案 0 :(得分:1)

这两个过程都应该在同一个交易上,以达到你想要的目的。

您可以通过删除[sp_generateNewId] proc中的事务控制来实现此目的。

仅供参考,您无需担心密钥生成,为什么不创建IDENTITY字段