我的ASP页面使用以下存储过程在SQL Server中存储会话变量:
CREATE PROCEDURE [dbo].[MyProcedure]
@sessionId varchar(512),
@variable varchar(350),
@value image
AS
BEGIN
BEGIN TRAN
DECLARE @result int = 0;
DECLARE @locked bit;
IF (SELECT COUNT(*) FROM Sessions WHERE id = @sessionId) = 0
BEGIN
SET @result = -1;
END
ELSE BEGIN
DELETE Variables WHERE sessionId = @sessionId AND variable = @variable
IF @value IS NOT NULL
BEGIN
INSERT Variables VALUES(@sessionId, @variable, @value, 0)
END
END
COMMIT TRAN
RETURN @result
END
但有一段时间,我得到一个主键例外(Msg 2627):"违反PRIMARY KEY约束' PK_Variables'。无法在对象' dbo.Variables'"中插入重复键。 注意:没有涉及触发器。
谢谢!
答案 0 :(得分:2)
假设您的PK在sessionId,variable
,那么使用相同@sessionId,@variable
的存储过程的并发执行可以做到这一点。
两者都执行
DELETE Variables WHERE sessionId = @sessionId AND variable = @variable
同时排队,然后两者都进入insert
。
只有在sessionId,variable
组合没有预先存在的记录时才会发生这种情况,因为DELETE
会阻止。