在存储过程SQL Server 2005中使用锁

时间:2011-05-10 10:36:25

标签: sql-server sql-server-2005

我希望避免在我的存储过程中实现并发性

这是我的脚本,我正在尝试SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

ALTER proc [dbo].[SP_GenerateNextReportID]
  @type nvarchar(255), @identity int output
   AS BEGIN
         SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
    declare @id int;
    set @id =  IsNull((select LastUsedIdentity from   ReportProcessGenerator       where Type = @type), 0)
    if(@id =0)
      insert ReportProcessGenerator values(@type, @id +1)
     else
        update ReportProcessGenerator set LastUsedIdentity = @id +1 where Type = @type

    set @identity = @id +1
  END

不确定这是否正确?

1 个答案:

答案 0 :(得分:2)

如果您在UNIQUE上有PRIMARY KEY索引或ReportProcessGenerator.Type,那么您的存储过程将无法同时修改相同类型的记录。

请注意,您应该使用SELECT FOR UPDATEOUTPUT子句来避免死锁,正如@Martin指出的那样。对于SERIALIZABLE,并发SELECT次查询将无法解除UPDATE查询以后无法升级的共享锁。

但是,为什么要保持单独的每种类型的身份?通常,一种在不同类型中唯一的标识与在类型中唯一的多种标识一样好,前者更容易维护。