我希望避免在我的存储过程中实现并发性
这是我的脚本,我正在尝试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
不确定这是否正确?
答案 0 :(得分:2)
如果您在UNIQUE
上有PRIMARY KEY
索引或ReportProcessGenerator.Type
,那么您的存储过程将无法同时修改相同类型的记录。
请注意,您应该使用SELECT FOR UPDATE
或OUTPUT
子句来避免死锁,正如@Martin指出的那样。对于SERIALIZABLE
,并发SELECT
次查询将无法解除UPDATE
查询以后无法升级的共享锁。
但是,为什么要保持单独的每种类型的身份?通常,一种在不同类型中唯一的标识与在类型中唯一的多种标识一样好,前者更容易维护。