zamiast poniższego kodu
BEGIN
INSERT INTO EmailsRecebidos (De, Assunto, Data)
VALUES (@_DE, @_ASSUNTO, @_DATA)
WHERE NOT EXISTS ( SELECT * FROM EmailsRecebidos
WHERE De = @_DE
AND Assunto = @_ASSUNTO
AND Data = @_DATA);
END
zamień na
BEGIN
IF NOT EXISTS (SELECT * FROM EmailsRecebidos
WHERE De = @_DE
AND Assunto = @_ASSUNTO
AND Data = @_DATA)
BEGIN
INSERT INTO EmailsRecebidos (De, Assunto, Data)
VALUES (@_DE, @_ASSUNTO, @_DATA)
END
END
Aktualizacja: (dzięki @Marc Durdin za wskazanie)
Zwróć uwagę, że przy dużym obciążeniu, to nadal czasami kończy się niepowodzeniem, ponieważ drugie połączenie może przejść test IF NOT EXISTS, zanim pierwsze połączenie wykona INSERT, tj. stan wyścigu. Odwiedź stackoverflow.com/a/3791506/1836776, aby uzyskać dobrą odpowiedź na pytanie, dlaczego nawet zawijanie w transakcję nie rozwiązuje tego.