Что может быть причиной исключения первичного ключа? - PullRequest
3 голосов
/ 02 декабря 2011

Мои страницы 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

Но время от времени я получаю исключение первичного ключа (сообщение 2627): "Нарушение ограничения PRIMARY KEY 'PK_Variables'. Невозможно вставить дубликат ключа в объект 'dbo.Variables'". Примечание. Триггеры не задействованы.

Спасибо!

1 Ответ

2 голосов
/ 02 декабря 2011

Если ваш ПК включен sessionId,variable, тогда параллельное выполнение хранимой процедуры с тем же @sessionId,@variable может сделать это.

Оба выполняют строку

DELETE Variables WHERE sessionId = @sessionId AND variable = @variable

одновременно, а затемоба переходят к insert.

Это может произойти, только если не существует ранее существующей записи с комбинацией sessionId,variable, так как тогда DELETE s будет блокироваться.

...