【问题标题】:using Lock in Stored Procedure SQL Server 2005在存储过程 SQL Server 2005 中使用锁定
【发布时间】:2011-05-10 20:30:41
【问题描述】:

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

这是我的脚本,我正在尝试 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

不确定这是否正确?

【问题讨论】:

标签: sql-server sql-server-2005


【解决方案1】:

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

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

但是,您为什么要维护单独的每种类型的身份?通常,一个跨类型唯一的标识与多个类型内唯一的标识一样好,前者更容易维护。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多